- 締切済み
続・EOF判定されない
前回「EOF判定されない」で回答、アドバイスしていただいた a-kumaさん、Haizyさん、inthefloiさん、anisolさん、leaz024さん、cherry-moonさん 本当にありがとうございました。頂いたアドバイスを試行してみましたが、なぜか、ダメでした。(T-T) 環境が悪いのかもしれませんね。 あれから、feof関数を使わずにファイルの終わりを算出して判定するなどの方法を試みましたが、EOF判定だけのために妙に複雑になってしまい、自分でも納得がいかなかったので、再度こちらで皆さんの意見をもらおうと投稿させてもらいました。 今回は質問の仕方を変えて、モジュールの仕様を挙げますので、それから「自分ならこうする」というようなお答えを頂けたらと思っています。 feof関数を使用しても、その他の方法でもなんでもアリです。(^^) 「ファイル一行入力モジュール」(仕様) 1.このモジュールは実行されると「inputfile.txt」から一行だけ(改行まで)読み込み、終了します。次に実行された時は、その次の行を読み込みます。 2.ファイルの終端に達したら、リターンコードに'4'を設定し、終了する。 以上これだけ。(^^; 「inputfile.txt」(仕様) インプットファイルは、テキストファイルで、一行30バイトの文字列を格納しています。ファイルの総バイト数は不定です。 文字コードは「Shift-JIS」「改行=CR+LF」、ファイルの最後にEOF制御文字を設定しています。 「インプットファイルの内容」 1行目 AAAAAAAAAABBBBBBBBBBCCCCCCCCC[改行文字] 2行目 DDDDDDDDDDEEEEEEEEEEFFFFFFFFF[改行文字] ・ ・ ・ n-1行目 XXXXXXXXXXYYYYYYYYYYZZZZZZZZZ[改行文字] n行目 [EOF] 「ここはこうしたらいいんじゃないかな?」的な事でかまいませんので、是非みなさんの意見を聞かせてください。
- みんなの回答 (8)
- 専門家の回答
補足
毎度毎度説明不足でスイマセン(--: ・EOF制御文字は、秀丸エディタのオプションで「保存する時に、EOF制御文字を付加する。」にチェックを入れることでファイルに保存されています。 バイナリエディタで見ると'1A'となっています。 ・Windowsベースのプログラムです。 次に、 EOFだけを書き込んだファイルですが、秀丸では文字が記述されていないと保存できずに削除しようとするので、他のバイナリエディタを使用し1Aとだけ書いて保存しました。 それから説明不足がもう二つあります。(ホントすいません) 1.fgetsの第二引数にunsigned long型のlengthという箱を使ってます。 で、このlengthにrecord_lngsをstrtolでlong型に変換して代入しています。 unsigned long length; char record_lngs[5]; ←これには00020という文字列が格納されています。 char *endptr; char buf[32756]; length = strtol(record_lngs, &endptr, 10); if (fgets(buf, length, in) == NULL) { if (feof(in)) { return 4; } } こんなかんじで実行しましたが、4は返ってきませんでした。 lengthに入ってるの20じゃダメじゃん!?と、お思いでしょうがなぜかこれでgetは正常に行われます。lengthに1や2を足してgetすると、何も読みこまれなくなります。これも謎ですね。 2.inputfile.txtは1レコード(一行)の大きさが32756バイトです。今回その1レコード(一行)に入っているデータは固定長の20バイトですが、他にも5000や,32756バイト入っている場合もあります。 こんな粗悪な説明でわかりますでしょうか?また何か説明が必要でしたら書き込んでください。(うう、もっと文章力つけとけばよかった)