在尝试读取仅为输出打开的文件时,将为流设置eofbit标志。这是为什么?

时间:2013-02-08 15:55:03

标签: c++ fstream

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    fstream file("out.txt", ios_base::app);

    file.seekg(0, ios_base::beg);

    char buffer[100];

    if( !file.getline(buffer, 99) )
        cout << "file.failbit  " << boolalpha << file.fail() << "   file.eofbit   " << file.eof()
                 << '\n'
             << "file.badbit   " << file.bad() << "  file.goodbit  " << file.good() << '\n';

}

输出

enter image description here

1 个答案:

答案 0 :(得分:2)

该标准禁止您从仅为输出打开的文件中读取。来自basic_filebuf的第27.9.1.1.3段(fstream的基本实施的一部分):

  

如果文件没有打开读取,则无法读取输入序列。

因此,当试图从仅为写入打开的文件中读取时,人们会期望看到failbit。该标准还说,只要eofbit到达输入序列的末尾,就会设置getline。由于您实际上有一个空的输入序列(即,您无法读取的文件),因此第一次调用getline也会设置eofbit。在标准中,基础流缓冲区下溢basic_streambuf::underflow()在失败时返回traits::eof()(参见27.6.3.4.3第7-17段)。

要解决此问题,请将ios_base::in添加到文件的openmode。