9

如何使用 std::ifstream 检测并移至下一行?

void readData(ifstream& in)
{
    string sz;
    getline(in, sz);
    cout << sz <<endl;
    int v;
    for(int i=0; in.good(); i++)
    {
        in >> v;
        if (in.good())
            cout << v << " ";
    }
    in.seekg(0, ios::beg);
    sz.clear();
    getline(in, sz);
    cout << sz <<endl; //no longer reads
}

我知道如果发生错误,好的会告诉我,但是一旦发生错误,流就不再起作用了。在阅读另一个 int 之前,我如何检查我是否在行尾?

4

2 回答 2

19

使用 ignore() 忽略所有内容,直到下一行:

 in.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

如果您必须手动执行,只需检查其他字符以查看是否为 '\n'

char next;
while(in.get(next))
{
    if (next == '\n')  // If the file has been opened in
    {    break;        // text mode then it will correctly decode the
    }                  // platform specific EOL marker into '\n'
}
// This is reached on a newline or EOF

这可能会失败,因为您在清除坏位之前进行了搜索。

in.seekg(0, ios::beg);    // If bad bits. Is this not ignored ?
                          // So this is not moving the file position.
sz.clear();
getline(in, sz);
cout << sz <<endl; //no longer reads
于 2009-01-25T15:33:09.863 回答
3

您应该在循环之后清除流的错误状态in.clear();,然后流将再次工作,就像没有发生错误一样。

您还可以将循环简化为:

while (in >> v) {
  cout << v << " ";
}
in.clear();

如果操作成功,则流提取返回,因此您可以直接测试它而无需显式检查in.good();.

于 2009-01-25T09:06:48.483 回答