ファイルからのデータ読み込み
ふたたびお世話になります。
やまもと@ふくしま です。
前回は、ポインターの理解が不十分なのが原因でした。
教えていただいたようにプログラムを変更したところ
なおりました。
よく考えると、当たり前のことで納得いたしました。
どうもありがとうございました。
しばらく、快調?にプログラムを作成していたのですが、
再び、よくわからない現象に遭遇しまして、恥ずかしながら、UPさせて
頂きました。
お知恵を貸していただけると、大変助かります。
作成したプログラムの概要及び、コードは以下の通りです。
問題点は、その下の書いてあります。
指定した行数分の乱数を発生して、それをファイルに一端書き込み
(プログラム1)
書き込んだものをソートプログラムで読み込む(プログラム2)という
ものなのですが、、、、
プログラム1
main(){
FILE *fp;
int line_no,i,ransu;
srand((unsigned int)time(NULL));
if((fp = fopen("ran_dat.txt","w")) == NULL){
printf("ファイル作成失敗");
exit(1);
}
printf("乱数を何行作りますか :");
scanf("%d",&line_no);
for(i = 0 ; i < line_no ; i++){
ransu = rand() % 2000;
fprintf(fp,"%d \n",ransu); ←%d \n を %d¥nと続けて書いたりした
が変化無し
}
printf(" %d 行の乱数を作りました",line_no);
fclose(fp);
}
プログラム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で作成したファイルを見ても
ファイルの先頭に改行コードが来た形跡は無く ? という状態です。
コンパイラをLSI-c86からbccに変更しても同じようにエラーになり、
データファイルを手で打ち込んで再度プログラムで読み込ませたりすると
再び正常にもどったりして、とにかく安定しません。
書き込み時でfprintf内部の制御文字を%d \n と空欄をあけていたのを
%d\nに変更したりして、バグが再現するかどうかみたのですが、どちらの場合も動い
て
しまいました。(この場合、前者の空欄を空けるのは、atoi等で正常に変換されるの
が
不思議)
なにか、忘れている事があるのでしょうか
よろしくお願いします。
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