3
#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';

}

输出

在此处输入图像描述

4

1 回答 1

2

该标准禁止您读取仅为输出而打开的文件。从第 27.9.1.1.3 段basic_filebuf(底层实现的一部分fstream)开始:

如果文件未打开以进行读取,则无法读取输入序列。

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

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

于 2013-02-08T16:43:07.530 回答