こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

fscanf()【C言語】

テキストファイルをうまく読み込んでくれません。
どうかご教示お願いいたします。

環境
Windows7
Borland C++ 5.5.1 for Win32

status.txtの内容
1.50,40.0
1.55,45.0
1.60,50.0
1.65,55.0
1.70,60.0
1.75,65.0
1.80,70.0
1.85,75.0
1.90,80.0

プログラムの内容
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
FILE *filepointer;
double s[10],w[10];
int i=0,ret;
if((filepointer=fopen("status.txt","rt"))==NULL){
printf("file open error!!\n");
exit(1);
}
printf("%X\n",filepointer);
while((ret=fscanf(filepointer,"%f,%f",&s[i],&w[i]))==2){
i++;
printf("%d%f%f\n",ret,s[i],w[i]);
}
fclose(filepointer);
return 0;
}

出力結果
40E714
2 0.000000 0.000000
2 0.000000 0.000000
2 0.000000 0.000000
2 0.000000 0.000000
2 0.000000 0.000000
2 0.000000 0.000000
2 5.121811144940079976000000000000000000000e+303 0.000000
2 0.000000 0.000000
2 0.000000 0.000000

投稿日時 - 2013-05-23 16:44:52

QNo.8101543

困ってます

質問者が選んだベストアンサー

while((ret=fscanf(filepointer,"%f,%f",&s[i],&w[i]))==2){
i++;
printf("%d%f%f\n",ret,s[i],w[i]);
}
ここのところを以下のようにしてください。
while((ret=fscanf(filepointer,"%f,%f",&s[i],&w[i]))==2){
printf("%d%f%f\n",ret,s[i],w[i]);
i++;
}

投稿日時 - 2013-05-23 16:59:46

補足

i++;の位置を直したら全てきれいに出てくれました。
ありがとうございます。

しかし、なぜなのでしょうか?

投稿日時 - 2013-05-24 13:03:25

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

Wr5

>しかし、なぜなのでしょうか?

1行ずつトレースしていけば判るかと思いますが……

ループ1回目(iの値は0)=>
while((ret=fscanf(filepointer,"%f,%f",&s[0],&w[0]))==2){
->ということでs[0]とw[0]に読み込み。
i++;
->iがインクリメントされて1になる。
printf("%d%f%f\n",ret,s[1],w[1]);
->値が未設定のs[1]とw[1]を表示する。

ループ2回目(iの値は1)=>
while((ret=fscanf(filepointer,"%f,%f",&s[1],&w[1]))==2){
->ということでs[1]とw[1]に読み込み。
 (s[1]とw[1]の内容は更新されるが、表示済みの内容を書き換えてはくれない)
i++;
->iがインクリメントされて2になる。
printf("%d%f%f\n",ret,s[2],w[2]);
->値が未設定のs[2]とw[2]を表示する。

以下略。

投稿日時 - 2013-05-25 00:46:34

ANo.6

Wr5

ついでに……status.txtが11行以上あったりすると吹っ飛びかねないのでその辺りにはご注意を。

投稿日時 - 2013-05-23 17:08:49

ANo.5

Wr5

ああ、確かにiのインクリメント位置がおかしいですな。
ツッコミサンクスです。>#4&#5

しかし…ローカル変数ですからゴミが出るかと思いきや、以外とまともな値(0)が表示されていますな。
まぁ、1箇所へんなの出ていますけど。

投稿日時 - 2013-05-23 17:06:59

ANo.3

ついでだけどインクリメントの位置はおかしい.

投稿日時 - 2013-05-23 16:58:21

ANo.2

Wr5

>while((ret=fscanf(filepointer,"%f,%f",&s[i],&w[i]))==2){

「scanf double」で検索すると……。
http://www.ei.fukui-nct.ac.jp/~t-saitoh/edu/ProgAppl/pa-faq-float.html
http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-3
などなど……。

%fではなく%lfを使用して下さい。

投稿日時 - 2013-05-23 16:54:38

ANo.1

scanf系関数の「%f」は「float型」だよ。

質問者さんは、float型ではなく、double型の変数のポインタを指定してるよね?

「%f」を「%lf」にしてみよう。

これ、scanfの「基本中の基本」だから、こういう質問は「超恥ずい」っすよ。

投稿日時 - 2013-05-23 16:52:51

補足

いろいろ書き換えてる間にdoubleに変えていることを忘れていました。
申し訳ないです。

floatに直した出力結果です。
40E714
2 0.000000 0.000000
2 0.000000 0.000000
2 0.000000 0.000000
2 0.000000 0.000000
2 168728878714947758600000000000000000000.0 0.000000
2 0.000000 0.000000
2 0.000000 0.000000
2 0.000000 0.000000
2 0.000000 0.000000

投稿日時 - 2013-05-24 13:00:04

あなたにオススメの質問