1

3 つの列を持つファイルからデータを読み込んでいます。たとえば、データは次のようになります。

3  START  RED
4  END    RED

データを読み込むために、次のチェックを使用しています。

while (iFile.peek() != EOF) {
   // read in column 1
   // read in column 2
   // read in column 3
}

私の問題は、ループが通常余分なループを実行することです。これは、多くのテキスト エディターが実際のコンテンツの最終行の後に空白行を挿入するように見えるためだと確信しています。

少しグーグルで検索してSOを検索したところ、EOFが最後の行を繰り返すまでテキストファイルから読み取るなどの同様の状況がいくつか見つかりましたが、私の問題を解決するために与えられた解決策をうまく適応させることができなかったようです. 助言がありますか?

4

5 に答える 5

4

EOF は予測ではなく、エラー状態です。したがって、列 1、2、および 3 を読み取ることができるかどうかを予測するために、現在使用しているように使用することはできません。そのため、C++ での一般的なパターンは次のとおりです。

while (input >> obj1 >> obj2) {
  use(obj1, obj2);
}

すべてoperator>>(istream& is, T&)入力ストリームを返します。ブーリアン コンテキストで使用すると、最後の抽出が成功している限り、ストリームは「true」になります。その後、抽出されたオブジェクトを安全に使用できます。

于 2009-10-27T10:19:40.923 に答える
2

推定iFileは次のistreamとおりです。

EOF (で確認できます) だけでなく、エラーが発生した場合はループから抜け出す必要がありますiFile.eof()。これは、フォーマットの失敗によってストリームが EOF 以外の悪い状態に設定される無限ループであるためです。通常、すべてが読み取られた後 (成功したかどうかに関係なく)、ループに入る前に、ループの途中で読み取りループから抜け出す必要があります。

もう興味深いものがないことを確認するには、ループの後にストリームの状態をリセットしてから、EOF に到達するまで空白のみを読み取ろうとすることができます。

while( !iFile.eof() )
{
   iFile >> std::ws;
   string line;
   std::getline(iFile,line);
   if(!line.empty()) error(...);
}
于 2009-10-27T08:10:26.053 に答える
0

ループの回数を気にする必要はありません。データを検証し、無効な入力を処理するだけです。

基本的に、読み取る列が 3 つあることを確認し、それがファイルの終了によるものなのか、それとも他の問題によるものなのか判断できない場合は、確認してください。

于 2009-10-27T08:06:07.420 に答える
0

いずれかの読み取りが失敗した場合 (列データを読み取る場所)、while ループから抜け出します。おそらく、ファイルの最後にいて、最後の「正しくない」行を読んでいると思われます

于 2009-10-27T08:01:13.810 に答える
0

おそらく、空白やその他の無効な入力を処理することをお勧めします。おそらく、列1、2、3のいくつかの基本的な検証も望ましいでしょう。

于 2009-10-27T08:05:22.090 に答える