我正在解析输入文本文件。如果我使用getline()一次获取一行输入,有没有办法可以搜索字符串来获取整数?我在思考类似于Java中的getNextInt()。
我知道输入线上必须有2个数字;但是,这些值将由一个或多个空格字符分隔,因此我不能只是去一个特定的位置。
答案 0 :(得分:5)
有几件事需要考虑:
让我们假设你在每一行都有两个数字,然后是你不关心的文本。
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' );
}
另请注意,如果将整数值分开的唯一内容是“空格”,那么您甚至不需要使用ignore()行。
以上while()的工作原理是:运算符&gt;&gt;返回一个流对象(引用)。因为流对象正在布尔上下文中使用,所以编译器将尝试将其转换为bool,并且流对象具有执行该转换的强制转换运算符(通过在流上调用good())。
需要注意的重要事项是 NOT 才能使用
行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;
}
}
答案 1 :(得分:4)
如果那里唯一的东西是空格和整数,那就尝试这样的事情:
int i1, i2;
stringstream ss(lineFromGetLine);
ss >> i1 >> i2;
或更容易:
int i1, i2;
theFileStream >> i1 >> i2;
答案 2 :(得分:0)
它不仅仅是一点C-ish,但你可以在C字符串表示上使用sscanf()。或者您可以使用strtol()或亲戚 - 也可以使用C字符串表示。
更多C ++ - ish方式可能会使用字符串流和提取器。
答案 3 :(得分:0)
我试过了:
while (!inFile.eof()) {
getline (inFile,inputLine);
stringstream ss(inputLine);
ss >> rows >> columns;
}
我收到以下错误:
“术语不会在第
行评估为带有1个参数的函数”SS(inputLine);
编辑:所以你必须在给它参数时声明字符串流。上面编辑的Correctoed代码。
答案 4 :(得分:0)
永远不要使用.eof()来测试您是否可以读取或测试先前的读取是否失败。在某些情况下,这两种方法都会失败,因为:
一般情况下,只有在读取失败后才能使用.eof()来检查失败是否是由输入结束引起的。
使用while (std::getline(...))
进行循环播放。