2

次のコードは、コンパイルしてg ++で実行すると、「1」が2回出力されますが、ファイルに単一の構造をダンプしているため、「1」は1回だけ出力されると予想されますが、読み取り中に2つの構造を読み取っているようです. なんで?

#include <iostream.h>
#include <fstream.h>

int main(){
    struct student
    {
        int rollNo;
    };
    struct student stud1;
    stud1.rollNo = 1;

    ofstream fout;
    fout.open("stu1.dat");
    fout.write((char*)&stud1,sizeof(stud1));
    fout.close();

    ifstream filin("stu1.dat");
    struct student tmpStu;
    while(!filin.eof())
    {
          filin.read((char*)&tmpStu,sizeof(tmpStu));
      cout << tmpStu.rollNo << endl; 
    }
    filin.close();
}
4

5 に答える 5

11

eof読み取りが失敗した後にのみ設定されるため、読み取りは 2 回実行され、2 回目はバッファーが変更されません。

これを試して:

while(filin.read((char*)&tmpStu,sizeof(tmpStu)))
{
    cout << tmpStu.rollNo << endl; 
}

または

while(!filin.read((char*)&tmpStu,sizeof(tmpStu)).eof())
{
    cout << tmpStu.rollNo << endl; 
}

Read は、呼び出されると filin への参照を返します。これは、ストリームがまだ正常である場合に true と評価されます。read がそれ以上のデータの読み取りに失敗すると、参照は false と評価され、ループに入ることができなくなります。

于 2009-01-13T18:29:07.147 に答える
5

ファイルの終わりを超えて最初に読み取ろうとするまで EOF 条件が true にならないため、while ループが 2 回実行されています。したがって、cout は 2 回実行されます。

于 2009-01-13T18:29:40.157 に答える
2

eof正確な方法とread作業のために、これは 1 を2回出力します。ファイルの最後にいる場合readは失敗し、その後の呼び出しはtrueeof 返します。ファイルの終わりを超えて読み取りを試みていない場合、eof読み取るデータが残っていなくても、ストリームが EOF 状態ではないため、 は false を返します。

要約すると、呼び出しは次のようになります。

eof - false (at beginning of file)
read (at beginning of file)
eof - false (now at end of file, but EOF not set)
read (at end of file. fails and sets EOF state internally)
eof - true (EOF state set)

より良い戦略は、電話eofの直後に確認することです.read

于 2009-01-13T18:33:51.460 に答える
1

filin.eof() をチェックしているためだと思いますが、2回目に読むまではそうではありません。

ここを参照してください。eofbit が設定されていることに注意してください。あなたの場合、2回目の読み取りまでEOFにヒットしません。

于 2009-01-13T18:30:53.807 に答える
0

涼しい。別の方法(専門家交換の礼儀、私はそこで同じ質問をしました:-))

while(filin.peek() != EOF)
{
    filin.read((char*)&tmpStu,sizeof(tmpStu));
    cout << tmpStu.rollNo << endl;
}
于 2009-01-13T19:11:23.943 に答える