- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ファイル読み込みが上手くできません)
ファイル読み込みが上手くできません
このQ&Aのポイント
- C言語初心者の質問者は、大きなファイルを読み込んで処理するプログラムを作成していますが、最後の1回のループでファイルポインタが進まない問題に遭遇しています。
- 質問者は、ファイルを構造体に格納し、400000行ごとに読み込んで処理を実行していますが、最後の1回のループだけファイルポインタが進んでいない状況です。
- コードを確認したところ、最後のループ内のwhile文で、ループ変数iの増加がないため、ファイルポインタが進まないことが分かりました。ループ内でiを増加させるように修正すると問題が解決するはずです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
iの初期化とカウントアップは正しく処理されているという前提で。 ファイルポインタが進まないのではなくて、ファイル終端に達した場合の処理が正しくないのでは? if (feof(fp)){ break; } でfcをループカウンタとしたforループから抜けていますが、iを使ったwhileループでは、どこまでデータが読み込まれたか確認せずにMAX_SIZE-1までループしてますよね。 たとえばfc=0の時にfeof(fp)がtrueになったとして、そのあとのwhileループはMAX_SIZE-1回処理されてしまうので、一回前の処理で読み込まれたTDに対して処理を行い、結果ファイルポインタが進んでないように見えるということになりませんか? fcの上限がMAX_SIZEで、iの上限がMAX_SIZE-1というのもおかしいと思います。
その他の回答 (1)
- maiko0318
- ベストアンサー率21% (1483/6969)
回答No.1
while (i < MAX_SIZE - 1){ 読んだ件数をカウントして処理しないと、 構造体に残っている前のデータが処理されてしまっている。 fcを使いましょう。
質問者
補足
maiko0318さん ご回答ありがとうございます。 今更ですが、貼り付けたコードにミスがありました。 while ループを抜けたときにi=0をしているのですが、記載したコードでは抜けていました。 申し訳ございません。 読んだ件数をカウントして処理するというのは、MAX_SIZEの代わりにfcを使用するということでしょうか? 現状、構造体の中身はwhileループで処理をした後のforループ内で上書きしていると思っていました。 実際に最後の1回以外は予定通り構造体の中身が更新されているように見えていたのですが、fcを使わないと上手く処理できないようですので、修正してみます。
お礼
m-take0220さん 返信が遅くなり、申し訳ございません。 ご回答、ありがとうございました。 前の回答でmaiko0318さんもおっしゃっていたようにカウント処理が間違っていました。 最後のループだけ実行されていないように見えていましたが、実際は構造体に入れている値の MAX値が400000としていたため、ファイルの最大行数を越えた部分だけが前のデータで 使用されているようでした。 カウンタの値を変更したところ、目的の動作を行っています。 アドバイス、ありがとうございました。