ifstream
の次の文字がファイルの終わりかどうかを知る必要があります。私は.peek()
でこれをやろうとしています:
if (file.peek() == -1)
そして
if (file.peek() == file.eof())
しかしどちらも機能しません。これを行う方法はありますか?
編集:私がやろうとしていることは、ファイル内の各Wordの最後に文字を追加することです。そうするために、次の文字が句読点であるかどうかを尋ねますが、このようにして、最後のWordは余分な文字なしで残されます。私はchar
ではなく、string
だけを使用しています。
istream::peek()
は、検出時に定数EOF
(つまり、notが-1に等しいことが保証されている)を返しますファイルの終わりまたはエラー。ファイルの終わりを確実にチェックするには、次のようにします。
_int c = file.peek();
if (c == EOF) {
if (file.eof())
// end of file
else
// error
} else {
// do something with 'c'
}
_
基礎となるOSプリミティブ read(2)
は、EOFを読み取ろうとしたときにのみ通知することを知っている必要がありますpastファイルの終わり。したがって、ファイルの最後の文字をからまで読み取っただけの場合、file.eof()
はtrueになりません。つまり、file.eof()
がfalseであっても、次の読み取り操作が成功するわけではありません。
これはうまくいくはずです:
if (file.peek(), file.eof())
しかし、なぜ有用なデータを読み取ろうとした後でエラーをチェックしないのですか?
キーボードに接続されたストリームの場合、eof条件は、次の入力時にCtrl + D/Ctrl + Zを入力することです。
peek()
はそれをまったく見ることができません。 :-)
file.eof()
はフラグ値を返します。ファイルから読み取ることができなくなった場合は、TRUEに設定されます。 EOFは実際の文字ではなく、OSのマーカーです。そのため、そこにいるとき-file.eof()
はtrue
である必要があります。
したがって、if (file.peek() == file.eof())
の代わりに、読み取り(またはピーク)の後にif (true == file.eof())
を使用して、ファイルの終わりに達したかどうかを確認する必要があります(これは、私がしようとしていることです)正しく理解する)。
ほとんどのオペレーティングシステムにはファイルの終わり文字がないため、次の文字がファイルの終わりかどうかを判断する方法はありません。そうしようとすることは、新しいCおよびC++プログラマーが犯す最も一般的なエラーの1つです。 。ストリーム内の現在の位置を超えて読み取ると、ファイルの終わりを超えて読み取ることがわかりますが、これは一般的にかなり役に立たない情報です。代わりに、すべての読み取り操作の成功または失敗をテストし、そのステータスに基づいて行動する必要があります。
使用しているコードは表示されなかったので、私の推測はいくつかあります。ストリームを操作する場合、通常は低レベルの機能(peek()
など)は必要ありません。あなたがおそらく興味を持っているのはistream_iterator
。ここに例があります
cout << "enter value";
for(istream_iterator<double> it(cin), end;
it != end; ++it)
{
cout << "\nyou entered value " << *it;
cout << "\nTry again ...";
}
また、istreambuf_iteratorを使用して、バッファーを直接操作することもできます。
cout << "Please, enter your name: ";
string name;
for(istreambuf_iterator<char> it(cin.rdbuf()), end;
it != end && *it != '\n'; ++it)
{
name += *it;
}
cout << "\nyour name is " << name;
通常私が使用したファイルの終わりを確認するには:
if(cin.fail())
{
// Do whatever here
}
それを実装する別の方法は、.
while(!cin.fail())
{
// Do whatever here
}
追加情報が役立つので、私たちはあなたが何をしたいのかを知っています。