[解決済み] ifstreamのeof()はどのように動作するのですか?
質問
#include <iostream>
#include <fstream>
int main() {
std::fstream inf( "ex.txt", std::ios::in );
while( !inf.eof() ) {
std::cout << inf.get() << "\n";
}
inf.close();
inf.clear();
inf.open( "ex.txt", std::ios::in );
char c;
while( inf >> c ) {
std::cout << c << "\n";
}
return 0;
}
について、本当に迷っているんです。
eof()
関数を使用します。例えば、私のex.txtの内容がそうだったとします。
abc
常に余分な文字を読み込んで表示します。
-1
を使用して読み取る場合
eof()
. しかし
inf >> c
は正しい出力である'abc'を出力したのでしょうか?誰かこれを説明するのを手伝ってくれませんか?
どのように解決するのですか?
-1は
get
は、ファイルの末尾に到達したことを示す方法です。これを
std::char_traits<char>::eof()
(または
std::istream::traits_type::eof()
) - 1は避けてください、これはマジックナンバーです。(もうひとつは少し冗長ですが、いつでも
istream::eof
)
EOF フラグが設定されるのは、一度でも読み込みが行われたときだけです。
ファイルの終端を越えて
. もし3バイトのファイルがあって、3バイトしか読まなかった場合、EOFは
false
というのも、まだファイルの最後を読もうとしていないからです。これは、通常サイズを知っているファイルでは混乱するようですが、パイプやネットワークソケットのようなデバイスでは、読み取りが行われるまでEOFはわかりません。
2番目の例は、次のように動作します。
inf >> foo
は常に
inf
に格納しようとする副作用があります。
foo
.
inf
である。
if
または
while
と評価されます。
true
もしファイルがエラーもEOFもない良好なものであれば、quot;good" となります。したがって、読み込みに失敗すると
inf
に進化します。
false
となり、ループは正しく終了します。しかし、このようなよくあるエラーを考えてみましょう。
while(!inf.eof()) // EOF is false here
{
inf >> x; // read fails, EOF becomes true, x is not set
// use x // we use x, despite our read failing.
}
ところが、これ。
while(inf >> x) // Attempt read into x, return false if it fails
{
// will only be entered if read succeeded.
}
というのは、私たちが望んでいることです。
関連
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない