質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1473閲覧

C fscanfが重複する

Reizo

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/12/26 20:00

テキストファイルからfscanfで値を1行ずつ取り込みたいのですが、読み込みが1行につき2行ずつ読み込まれます。
下記のコードに修正点がありましたら、ご指摘をお願いします。

main.c

1 #include<stdio.h> 2 #include<math.h> 3 4 int main(void){ 5 6 FILE *fp; 7 char word; 8 double digit[26]={0}, number=0, H=0, em=0; 9 int count=0, i=0, k=0, nu=0; 10 11 fp = fopen("fileone.txt", "r"); 12 13 while(fscanf(fp, "%c %d", &word, &nu) != EOF){ 14 if(k>25){ 15 break; 16 } 17 18 number = number + nu; 19 digit[k] = nu; 20 printf("%d %f %d\n", nu, digit[k], k); 21 k+=1; 22 } 23 fclose(fp); 24 25 printf("%f\n", number); 26 for(i=0; i<26; i++){ 27 em = digit[i]/number; 28 H = H - (em*log2(em)); 29 printf("em = %f H = %f\n", em, H); 30 } 31 32 printf("H = %f\n", H); 33 34 return 0; 35 }

fileone.txt

a 993 b 271 c 604 d 529 e 1811 f 381 g 409 h 520 i 1098 j 86 k 134 l 472 m 352 n 1028 o 1338 p 441 q 11 r 1173 s 751 t 1524 u 509 v 111 w 284 x 29 y 334 z 4

実行結果

993 993.000000 0 993 993.000000 1 271 271.000000 2 271 271.000000 3 604 604.000000 4 604 604.000000 5 529 529.000000 6 529 529.000000 7 1811 1811.000000 8 1811 1811.000000 9 381 381.000000 10 381 381.000000 11 409 409.000000 12 409 409.000000 13 520 520.000000 14 520 520.000000 15 1098 1098.000000 16 1098 1098.000000 17 86 86.000000 18 86 86.000000 19 134 134.000000 20 134 134.000000 21 472 472.000000 22 472 472.000000 23 352 352.000000 24 352 352.000000 25 15320.000000 em = 0.064817 H = 0.255865 em = 0.064817 H = 0.511729 em = 0.017689 H = 0.614698 em = 0.017689 H = 0.717667 em = 0.039426 H = 0.901577 em = 0.039426 H = 1.085486 em = 0.034530 H = 1.253164 em = 0.034530 H = 1.420842 em = 0.118211 H = 1.785000 em = 0.118211 H = 2.149157 em = 0.024869 H = 2.281698 em = 0.024869 H = 2.414239 em = 0.026697 H = 2.553790 em = 0.026697 H = 2.693340 em = 0.033943 H = 2.859006 em = 0.033943 H = 3.024671 em = 0.071671 H = 3.297198 em = 0.071671 H = 3.569725 em = 0.005614 H = 3.611697 em = 0.005614 H = 3.653669 em = 0.008747 H = 3.713470 em = 0.008747 H = 3.773272 em = 0.030809 H = 3.927950 em = 0.030809 H = 4.082628 em = 0.022977 H = 4.207706 em = 0.022977 H = 4.332783 H = 4.332783

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

入力ストリームに改行が残るのが原因です。

fscanfの直後にprintfを追加して、読み取り件数と変数に設定された値を表示する:

int c; while((c = fscanf(fp, "%c %d", &word, &nu)) != EOF){ printf("%d, %d, %d\n", c, word, nu);

出力結果:

2, 97, 993 # 1回目は`a`と993の2件が読み込まれる。 993 993.000000 0 1, 10, 993 # 2回目は改行(0x0a)が1件読み込まれ、次の変数は元のままとなる。 993 993.000000 1 2, 98, 271 271 271.000000 2 1, 10, 271 271 271.000000 3 2, 99, 604 604 604.000000 4

"%c %d\n"で改行を読み飛ばせますが、確実に1行ずつ処理したい場合は、fgets(3)で1行読み込んでsscanf(3)で変数に設定するのが良いです。

投稿2017/12/26 21:33

編集2017/12/26 21:35
hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Reizo

2017/12/27 01:37

fgets()からsscanf()で変数に代入する方法で無事解決できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問