从一行解析整数

时间:2008-10-19 05:48:49

标签: c++ string parsing

我正在解析输入文本文件。如果我使用getline()一次获取一行输入,有没有办法可以搜索字符串来获取整数?我在思考类似于Java中的getNextInt()。

我知道输入线上必须有2个数字;但是,这些值将由一个或多个空格字符分隔,因此我不能只是去一个特定的位置。

5 个答案:

答案 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(例如,在最后一行的getline之后,如果最后一行有换行符)
  • 如果读取操作必须在结束后查看下一个字符以确定它应该停止读取(例如,在最后一行的地理线之后,如果在该行中没有换行符端)

一般情况下,只有在读取失败后才能使用.eof()来检查失败是否是由输入结束引起的。

使用while (std::getline(...))进行循环播放。