[解決済み] C++におけるファイルの終端
2022-03-07 20:27:10
質問
n×2の行列をそのままテキストファイルに保存しています。これをC++で読もうとすると
nb_try=0;
fin>>c_tmp>>gamma_tmp;
while (!fin.eof( )) //if not at end of file, continue reading numbers
{
// store
cs_bit.push_back(c_tmp);
gammas_bit.push_back(gamma_tmp);
nb_try++;
// read
fin>>c_tmp;
assert(!fin.fail( )); // fail at the nb_try=n
if(fin.eof( ))break;
fin>>gamma_tmp; // get first number from the file (priming the input statement)
assert(!fin.fail( ));
}
最初のアサートは、nb_try==n のときに失敗し、つまり fin.fail( ) が真になります。これは、存在しない最初の数字を読み込もうとしたときに起こります。しかし、最後の数字を読み込んだ後、fin.eof( )が真にならないのはなぜでしょうか?存在しない最初の数字を読んだときだけ真になるということでしょうか?また、fin.fail()とfin.eof()が同時に真になるというのは本当でしょうか?
ありがとうございます、よろしくお願いします
解決方法は?
これは、ファイルを読み込む方法が間違っているのです。
while (!fin.eof( ))
{
// readLine;
// Do Stuff
}
標準的なパターンは
while(getlineOrValues)
{
// Do Stuff
}
というわけで、あなたのコードをざっと見てみると、次のように書いた方が分かりやすいと思います。
while(fin>>c_tmp>>gamma_tmp)
{
// loop only eneterd if both c_tmp AND gamma_tmp
// can be retrieved from the file.
cs_bit.push_back(c_tmp);
gammas_bit.push_back(gamma_tmp);
nb_try++;
}
問題は、EOFが真になるのは AFTER を越えて読もうとしたとき。ファイル内に読むべき文字が残っていないことと、EOFが真であることは同じではありません。しかし、EOFはまだ偽なので、コードはループに再突入します。c_tmpを読もうとすると、EOFがトリガーされ、アサートがうまくいかなくなります。
解決策は、読み取りをwhile条件として置くことです。読み込みの結果はストリームになります。しかし、ストリームが(while条件のような)ブーリアン文脈で使用される場合、それはブールのように使用できる型に変換されます(技術的にはそれはvoid*ですが、それは重要ではありません)。
関連
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】Enterキーを押して続行する
-
[解決済み】変数やフィールドがvoid宣言されている