2012-01-04 30 views
2

ファイルから数値を読み込み、配列に格納しようとしています。今はプログラムを実行すると8個の数字が印刷され、行が終了して同じ8個の数字が印刷されます。それは決して終わりのないループです。私は間違って何をしていますか?.eof()ループが機能しない

#include <iostream>                
#include <fstream>                
using namespace std;                

int main()                  
{                    
    int num;                  
    ifstream infile;                
    infile.open("euler8Nums.txt");             
    infile >> num;//must attempt to read info prior to an eof() test    
    while(!infile.eof()){              
     cout << num << endl;              
     infile >> num;                
    }                   
    infile.close();                
    return 0;                 
} 
+0

が重複する可能性のようなものに変更することができます。com/questions/6512173/ifstream-not-reading-eof-character) –

答えて

11

通常、.eof()または.bad()を使用しないでください。ストリームが入力を解析するために失敗した場合だけで、それ自体が

while (infile >> num) 
    cout << num << endl; 

EOFフラグが設定されませんストリームの状態を確認してから、ストリーム状態が解除されるまで動作しなくなります。代わりにbadにチェックした場合、解析に失敗するまで実行されますが、EOFでバグが発生します。ストリームがまだ.good()であるかどうかを確認してください(whileループのときは暗黙的です)。あなたのケースでは

ファイルを開けませんでしたし、次にあなたが数字を読みしようとしているが、ファイルが開かれていないため、読み取りが何もをやっていないので、それは無限ループです。したがって、eofを読み取ることは無限ループです。

+0

はur変更を試したが、今は何も印刷されない – Sean

+0

@Sean:読み込みに失敗しました。あなたのコード_also_は読めませんでしたが、あなたはそれを知らなかったのです。あなたのファイル(A)が開いていないか、(B)内部に 'int'がありません。おそらく開こうとしない。 –

+0

'is_open()'を使ってファイルが正常に開かれたかどうかを調べることができます。 'good()'を使って、 'eof'、' failbit'、 'badbit'がすべて設定されていないことを確認することもできます。 – prelic

4

ファイルに含まれているもの、または最後の番号よりも無限ループ印刷がどのように起こるかはわかりません。ただし、eof()ビットはエラー報告にのみ有効ですが、ループ制御にはnotです。また、コードにはまったく必要のないものがたくさんあります。次のプログラムはOK数字をお読みください:

#include <iostream>                
#include <fstream>                

int main()                  
{                    
    std::ifstream infile("euler8Nums.txt"); 
    for (int num; infile >> num;) 
     std::cout << num << "\n"; 
    return 0; 
} 

を私は、ファイル名が出て加工することができる前に、必要に応じて、必要な条件がない限り、別途open()を呼んでポイントを見たことがありません。同様に、close()を明示的に呼び出すことは、入力ストリーム上のclose()に失敗する機会があるかどうかは不明ですが、クローズが成功したかどうかをチェックしない限り、無意味であるように見えます。

私のペットのかわいこのもう1つは、std::endlの不要な使用です:このマニピュレータは、パフォーマンスが悪い比較的頻繁に発生します。これは、改行文字、すなわち\n(または、ワイド文字の上にこの文字を拡大した結果ストリーム)の最後の書き込みを行う

  1. :それは2つのことを行います。
  2. ストリームをフラッシュします。ファイルストリームでは、これは非常に高価な操作であり、簡単に減速することができます(数パーセントだけでなく)。実際の書き込みは、データをファイルに書き込むコードの実際のリアルタイムパフォーマンスを支配することがよくあります。

実際にストリームをフラッシュするだけです。ストリームに余分なフラッシュが必要な場合は、クラッシュの直前に書かれたものを見つけようとするときには、ストリームオブジェクトにstd::unitbufを設定するだけです。これは、挿入のたびにストリームをフラッシュするため、パフォーマンスの観点からは悪くなりますが、問題が見つかると簡単に削除されます。 // stackoverflowの:

はもちろん、結果のプログラムでもすっきり(HTTP [はifstreamは、EOF文字を読んでいない]の

#include <iostream> 
#include <fstream> 
#include <algorithm> 
#include <iterator> 

int main() 
{ 
    std::copy(std::istream_iterator<int>(std::ifstream("euler8Nums.txt") >> std::ws), 
       std::istream_iterator<int>(), std::ostream_iterator<int>(std::cout, "\n")); 
}