2011-11-07 5 views
0

私はコード私はファイルを読んでいますが、読んでいる間に一度だけ最後の文字を読んでいますか?

void main() 
{ 
    int i=0; 
    ifstream fout1 ("Aj.txt",ios::binary); 
    if (fout1.is_open()) 
    { 
     while(fout1) 
     { 
     i++; 
     fout1.get(ch1); 
     cout<<ch1; 
     } 
     cout<<i; 
     fout1.close(); 
    } 
    else 
    { 
     cout << "Unable to open file"; 
    } 
    return 0; 
} 

に従うことによって、ファイルを読み込むしようとしていますここで、このコードは、ファイル全体を読み込み、それがループ内でそのファイルに4characterがある場合.howに、それは5時間を繰り返すだろうつまり、ループに1つの余分の時間を行きますそれを訂正するか、それを克服する。

+0

これはコンパイルされますか? –

+0

voidとreturn 0; – Furqan

+1

while(fout1.get(ch1)){cout << ch1; ++ i} – jrok

答えて

3

eofフラグが設定されているが、実際に障害が発生した読むまでeofフラグがセットされていないまでそのコードを読み取り。つまり、fout1.get(ch1)が最後の文字を読み取ったとき、eofではなく、に設定されています。だからそれは表示され、まだ良いですfoutをチェックするので、ループに再び入ります。その後、fout1.get(ch1)はeofのために失敗し、前の値ch1を再度表示します。ループを書く正しい方法は次のとおりです。

while(fout1.get(ch1)) { //false when it can't read any more characters 
    i++; 
    cout<<ch1; 
} 
cout<<i; 
fout1.close(); 
2

ストリームはまだ4番目の文字を読み込んだので、ストリームはまだ良好な状態です。したがって、5番目の文字を読み込もうとしますが、その時点でファイルの最後に遭遇します。 getを呼び出した後、ストリームの状態を確認する必要があります。例えば:

while(fout1.get(ch1)) 
{ 
    cout << ch1; 
    ++i; 
} 
0

これは、iostreamsに精通していない場合は簡単に間違います。 stream.eof()の場合、のファイルの最後の文字を読み取った場合はとなります。 より前にの末尾にと表示されたときにのみ適用されます。

for (;;) 
{ 
    fout1.get(ch1); 
    if (!fout1) break; 
    cout << ch1; 
    i++; 
} 
関連する問題