- ベストアンサー
fscanf/fprintfでのファイルの読み書き
以下のようなプログラムでファイルを使ったデータの読み書きをしているのですが、 fscanfの所で永久ループになってしまい、またファイルの最後の部分のみを 出力するという動作になってしまい困っています。 ソースを何度読み直してもどこがおかしいのかわかりません。 何か心当たりのある方どうかご教授下さい。お願いいたします。 #include <stdio.h> #include <stdlib.h> void main() { char in_name[10]; int in_ten,w_goukei=0; FILE *gf_pt; if((gf_pt=fopen("gakusei.dat","w+"))==NULL) { printf("FILE OPEN ERROR\n"); exit(EXIT_FAILURE); } printf("データを入力してください(終了は^Z)\n"); rewind(stdin); while((scanf("%s %d",in_name,&in_ten))!=EOF) fprintf(gf_pt,"%-10s %3d",in_name,in_ten); printf("\nデータを表示します\n"); rewind(gf_pt); while(fscanf(gf_pt,"%-10s %3d",in_name,&in_ten)!=EOF) { w_goukei+=in_ten; printf("%-10s %3d\n",in_name,in_ten); } printf(" %4d\n",w_goukei); if(fclose(gf_pt)==EOF) { printf("FILE CLOSE ERROR\n"); exit(EXIT_FAILURE); } }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
fscanfの書式指定の-を取り除いてください。
その他の回答 (1)
- shige_70
- ベストアンサー率17% (168/946)
さぞお困りでしょうけど、、、無理もないことと思います。 scanf()系のライブラリ関数はよほどのことがない限り使用すべきではありません。 なぜなら、挙動が非常に複雑で、特に人間の手による入力など不確定要素があると予想外の挙動を示すこともありとても動作不安定なプログラムになってしまうからです。 だからこそ、『ソースを何度読み直してもどこがおかしいのかわかりません』となってしまうのです。。。 通常は、文字列入力ならfgets() 数値入力ならfgets()にatoi()をかますのが一般によく使われる方法です。
お礼
なるほど~。今は勉強中なので、本を見ながら片っ端からプログラムを打っているのですが、実用的なものになるとそうゆうことも考慮に入れないといけないのですね。どうもありがとうございました!
お礼
gimmickさんのおっしゃるどおりやってみたところ上手く動きました!テキストどおり打っているのに動かないとは変な話です…(^^;)ありがとうございました!