从一行解析整数
我正在解析一个输入文本文件。如果我使用getline()一次获取输入的一行,是否有一种方法可以搜索字符串以获取整数?我正在考虑类似于Java中的getNextInt()。从一行解析整数
我知道在该输入行中必须有2个数字;然而,这些值将被一个或多个空格字符分隔,所以我不能只是去特定的位置。
如果在那里的唯一事情是空白和整数,只要尝试这样的事:
int i1, i2;
stringstream ss(lineFromGetLine);
ss >> i1 >> i2;
或更容易:
int i1, i2;
theFileStream >> i1 >> i2;
这不仅仅是一点点C-ISH多,但你可以在C字符串表示中使用sscanf()。或者你可以使用strtol()或亲属 - 也可以用C字符串表示。
更多的C++ - ish方式可能会使用字符串流和提取器。
我想:
while (!inFile.eof()) {
getline (inFile,inputLine);
stringstream ss(inputLine);
ss >> rows >> columns;
}
,我得到了以下错误:
“这一术语不计算为服用1个参数的函数” 在行
SS(inputLine);
编辑:所以你必须在你给它参数的时刻声明字符串流。上面编辑的正确代码。
顺便说一句:永远不要在eof()上循环,而是在读 - > while(std :: getline(....)) – 2008-10-19 08:28:53
有几件事要考虑:
让我们假设你在每一行上都有两个数字,然后是你不关心的文本。
while(inFile >> rows >> columns)
{
// Successfully read rows and columns
// Now remove the extra stuff on the line you do not want.
inFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
还要注意,如果分离的整数值的唯一的事情是“空白”,那么你甚至不需要使用忽略()行。
上述while()的工作原理是:操作符>>返回一个流对象(引用)。由于流对象正在布尔上下文中使用,编译器会尝试将其转换为布尔值,并且该流对象具有一个转换操作符(通过在流上调用good())进行转换。
重要的是要注意的是不使用线
while(inFile.eof())
如果你使用这个,那么你落入最后一行的问题陷阱。如果你已经读取了所有的数据,eof()仍然是错误的(因为在你尝试读取过去的EOF之前它是不正确的)。所以文件中没有数据,但你仍然进入循环体。在你的代码中,getline()然后被执行并失败(不再有数据),EOF现在被设置。循环的其余部分将取决于inLine的定义方式和位置。
您可以像上面那样使用此测试。但是,在使用它之后,您还必须愿意测试该流是否正常。
while(inFile.eof()) // Should probably test good()
{
getLine(inFile,inputline);
if(inFile.eof()) // should probably test good()
{
break;
}
}
千万不要使用。eof()用于测试您是否可以读取,也可用于测试之前的读取是否失败。因为这两种方法都将在某些情况下会失败:即使有没有留下任何字符,如果没有读取过去的结束已经又试图
- EOF没有设置(如最后一行的函数getline后,如果有最后一个换行符)
- 即使在成功读取后,如果读取操作必须在结束后查看下一个字符以确定它应该停止读取(例如,在最后一行的geline后,if最后没有换行字符)
一般而言,您应该只在读取失败后使用.eof()来检查输入结束导致失败。使用while (std::getline(...))
来循环线路。
如何做它的字符串不char * – Yoda 2012-06-19 12:18:32
@罗伯特:我不知道你的投诉是什么。你可以像`std :: string`一样容易地从char *构造一个stringstream。如果您有不同的问题,请提出一个新问题。但不要随意回答。 – Eclipse 2012-06-19 14:22:15