使用get line从文件输入

时间:2015-08-02 19:15:47

标签: c++ file fstream

我正在尝试从文件中读取,并且我已将它们分隔为新的行字符。我正在使用这些代码:

fstream input("wordfile.dat", ios::in);

char b[10];

while (!input.eof())
{
    input.getline(b, 10);
    cout << b << endl;
}

如果我将while语句从while(!input.eof())更改为while(输入),程序将在循环结束前输出一个空行。但现在不会。问题是,在两个语句中,while条件必须首先输入一行,并通过输入它,它将知道它是否已到达文件末尾或是否还有更多信息。因此input.eof()必须像其他语句一样运行并输出一个空行。首先我认为这是一个错误,但我想知道它为什么表现正确。这两个条件有什么区别?

1 个答案:

答案 0 :(得分:0)

我们看到operator bool ......

  

请注意,此函数与成员good [...]

的返回值不同

... if (stream) if (stream.good())相同,但也了解它......

  

返回是否设置了错误标志(failbitbadbit)。

所以它与not stream.fail()基本相同(如果设置了truefailbit,则为badbit)。 这也解释了while (stream)while (not stream.eof())之间的不同行为:

当输入文件没有以换行结束时,stream.getline(buffer, size)将在到达分隔换行符(或10个字符限制)之前遇到文件结尾,从而设置eofbit。然后,使用operator bool对流进行测试仍然是正确的(因为failbitbadbit都未设置),并且只有在尝试使用getline进行更多阅读后才会设置{ {1}}因为没有提取任何字符。

但是在使用failbit进行测试时,仅not stream.eof()将结束循环。

如果流是eofbit就是您要测试的,

good

然后,这意味着该流既不在文件末尾(if (stream) // ... ),也不在eofbad ed。

所以当它不在文件末尾时,它仍然可能失败或处于不良状态。

请参阅the table here

阅读(或写入)流时,请测试fail,除非您有特殊原因不这样做。

作为旁注,当您执行如下输入时会发生这种情况,因为good会返回对其调用的实例的引用:

getline