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 に答える