- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:末尾の行が二回読み込まれてしまいます。)
末尾の行が二回処理されてしまいます。なにがまずいのでしょうか?
このQ&Aのポイント
- 末尾の行が二回読み込まれてしまう問題が発生しています。
- 以下のコードで末尾の行が二回処理されてしまいます。
- ファイルを読み込む際に繰り返し処理を行っているため、末尾の行が二回処理されてしまいます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
... fscanf(fp,"%s",str); while(!feof(fp)){ s = translate(str); printf("%d\n",s); fscanf(fp,"%s",str); } ...
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
回答No.5
ちと規格を確認してみましたが, 「scanf系で読み込みに失敗した場合, 読み込めなかった変数の内容は変化しない」と読めます>#2. 「feof をやめて fscanf の返り値をチェックする」のが正解だと思う.
質問者
お礼
回答ありがとうございました。知らないことがおおく勉強になりました。
- SaKaKashi
- ベストアンサー率24% (755/3136)
回答No.4
質問者
お礼
回答ありがとうございます。いろいろ勉強になります。
- magicalpass
- ベストアンサー率58% (378/648)
回答No.2
最終行を実行した段階ではまだfpがファイルエンドに達していません。そこでfeof(fp)の結果が偽なのでもう1回ループが繰り返されます。 次にfscanfを実行したところfpがファイルエンドに達したので、strの内容は変更されずに帰ってきてるようです。strの内容が書きかえられていないので中身は前回の内容と同じまま関数translateが実行されているのです。 fscanfが失敗した時の格納先の内容はとくに動作が定義されていないようなので処理系依存かと思います。何も入っていないことを期待するなら呼び出しの前に空にしておくことをおすすめします。あるいはちゃんとfscanfの返り値を判断して処理を書くかですね。
質問者
お礼
回答ありがとうございます。勉強になりました。
- SaKaKashi
- ベストアンサー率24% (755/3136)
回答No.1
while (feof(fp)==0) { fscanf(fp,"%s",str); s = translate(str); printf("%d\n",s); } ではいかが?while条件を変えてみた。
質問者
お礼
回答ありがとうございます。残念ながらだめでした。
お礼
回答ありがとうございます。きちんと直りました。