3

X2マトリックスをそのままテキストファイルに保存しています。私はそれをC++で読もうとします

nb_try=0;
fin>>c_tmp>>gamma_tmp;
while (!fin.eof( ))      //if not at end of file, continue reading numbers
{
  // store
  cs_bit.push_back(c_tmp);
  gammas_bit.push_back(gamma_tmp);
  nb_try++;

  // read
  fin>>c_tmp;
  assert(!fin.fail( )); // fail at the nb_try=n   
  if(fin.eof( ))break;
  fin>>gamma_tmp; // get first number from the file (priming the input statement)
  assert(!fin.fail( ));    

}

nb_try == nの場合、最初のアサートは失敗します。つまり、fin.fail()はtrueです。これは、存在しない最初の数値を読み取ろうとしたときに発生します。しかし、最後の数値を読み取った後、なぜfin.eof()が真ではないのでしょうか。存在しない最初の数字を読んだときにだけ真になるということですか?また、fin.fail()とfin.eof()が同時にtrueになっているというのは本当ですか?

ありがとう、よろしく!

4

3 に答える 3

16

これはファイルを読む間違った方法です:

while (!fin.eof( ))
{
      // readLine;
      // Do Stuff
}

標準的なパターンは次のとおりです。

while(getlineOrValues)
{
    // Do Stuff
}

したがって、コードをすばやく見ると、次のように書く方が適切だと思います。

while(fin>>c_tmp>>gamma_tmp)
{
    // loop only eneterd if both c_tmp AND gamma_tmp
    // can be retrieved from the file.

    cs_bit.push_back(c_tmp);
    gammas_bit.push_back(gamma_tmp);
    nb_try++;   
} 

問題は、EOF は、試して読んだ後にのみ真なることです。読み取るファイルに文字が残っていないことは、EOFが真であることと同じではありません。したがって、最後の行を読み取って値を取得すると、読み取るものは何も残っていませんが、EOF はまだ false であるため、コードは再びループに入ります。c_tmp を読み取ろうとすると、EOF がトリガーされ、アサートがナシ型になります。

解決策は、読み取りを while 条件として配置することです。読み取りを実行した結果がストリームです。ただし、ストリームがブール コンテキスト (while 条件など) で使用されると、ブールのように使用できる型に変換されます (技術的には void* ですが、それは重要ではありません)。

于 2009-09-29T19:09:02.433 に答える
5

IIRC、実際にファイルの末尾を超えて読み取ろうとするまで、eofbit は設定されません。つまり、ファイルの最後に到達したら、そのフラグが設定される前にもう一度読み取る必要があります。

于 2009-09-29T19:16:02.623 に答える
0

テキスト ファイルに引用符なしの "12345 67890" というシーケンスが含まれている場合、#3 は false を返しますが、#4 は true を返します。これは、最後の数字の後に空白がないためです。

int i;
bool b;

fin >> i;

b = fin.fail();  // 1
b = fin.eof();   // 2

fin >> i;

b = fin.fail();  // 3
b = fin.eof();   // 4

fin >> i;

b = fin.fail();  // 5
b = fin.eof();   // 6

ただし、シーケンスが「12345 6789」の場合 (最後の数字の後のスペースに注意してください)、#3 と #4 は両方とも false を返しますが、#5 と #6 は true を返します。

eof() と fail() の両方をチェックする必要があり、両方が true の場合は、これ以上データがありません。fail() が true で eof() が false の場合、ファイルに問題があります。

于 2009-09-30T00:04:58.420 に答える