Re: ファイルからのデータ読み込み
> 鴻池です。
>
> "h.o" <gaster11@poplor.ocn.ne.jp> wrote in message
> news:bj1dsh$cco$1@news-est.ocn.ad.jp...
> > プログラム2(ファイル読み込み部)
> > void file_read(void){
> >
> > FILE *fp;
> >
> > char buff[20];
> >
> > line_no = 0; /* 行数カウンター(グローバル)初期化 */
> >
> > if((fp = fopen(FILE_NAME,"r")) == NULL){
> > printf("ファイルが存在しません");
> > exit(1);/* ファイルが無ければプログラム終了 */
> > }
> >
> > while(1){
> > if(fgets(buff,sizeof(buff)-1,fp) == NULL) break;
> >
> > if( buff[0] == '\n' ) break; ← 「問題の行」 A
> >
> > if(line_no == MAX_DATA){
> > printf("%d 行に達しましたので読み込みを中止します \n",MAX_DATA);
> > break;
> > }
> >
> > data[line_no] = atoi(buff); /* 文字列を整数に変換 */
> >
> > line_no = line_no + 1; /* 行番号をインクリメント */
> >
> > }
> >
> > fclose(fp); /* オープンしたファイルを閉じる:必修 */
> > }
> >
> > 問題点
> >
> > プログラム2で、Aの位置に
> > if( buff[0] == '\n' ) break;
> > という行を入れてありますが、この行を入ると、ファイルを読み込まずに終了し
て
> > しまう場合がありました(ファイル末端で改行コードだけの行が来たら終了させ
る
> > 目的のために入れたコードです。)
> >
> > 要するに、ファイルの先頭に改行コードが入っているという
> > 事になるのですが、、、、プログラム1で作成したファイルを見ても
> > ファイルの先頭に改行コードが来た形跡は無く ? という状態です。
>
> プログラム1にしても,2でもよく分らないのですが,2について言えばやたら
> breakが多くてなぜそんなに必要なのか理解し難い感じで゜す。で,疑問なのは,
> 「要するに、ファイルの先頭に改行コードが入っているという事になるのですが」
と
> いうのは,何を根拠にそう判断したのて゜しょうか。とりあえず,fgetsの仕様を
よ
> く読んでみると疑問も解決するように思いますが。(プログラムがどこで終了して
い
> るかdebagなりprintfなり挿入して確認すれば,分ると思いますが。)
>
> --
> ******************************
> keizi kounoike
> ******************************
>
解答ありがとうございます。
勉強中ゆえ、いたらない点おゆるしください。
上記質問の件ですが
なぜ ファイルの先頭に改行コードが入っていると判断したのか という点ですが
これは、printfを、この部分に挿入してみてわかりました。
詳しく説明させていただきますと
この後に読み込んだデータを表示させるプログラムがあるのですが、何も表示が出て
きませんので
おかしいと思い、いろいろ調べた結果、(printfをいろいろいれてみて)ファ
イルを読んでいないという事がわかりました。
このAの部分をコメントアウトすると問題なくプログラムが動いた点からも、この部
分が
バグであると判断いたしました。
しかしながら、上記に書きましたが、メモ帖でデータファイルを開いても、
ファイル先頭部に改行コードはみつかりません。
この部分が理解できない部分であります。
尚、break文が多いのは、本当は要素数を超えてデータを読み込もうとしたときに
mallocでデータ追加しようと考えているのですが、配列にした場合、どうすれ
ばいいのか
コードがうかばなかったので、とりあえず、要素数以上のデータを読み込もうとした
ら
そこで打ち切り、という(暫定的なプログラムにしてあります。
汚くて申し訳ありません。
現時点でプログラムは正常に動作しており、さっきのは何だったのか 謎です。
今疑っているのは、ストリームになんらかの形でデータが残っていたのではないかと
そちらを調べています。
確かフラッシュする関数があったはずだけど、思い出せない、、、、、
複雑な事はなにもしてないのでfgetsの仕様によるものではないと考えています。
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735