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

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

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

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

Q&A

解決済

2回答

1065閲覧

C言語でファイルを読み込み、一部の要素を取り出してそれを演算するコードのエラー

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

1クリップ

投稿2018/01/17 01:28

###前提・実現したいこと
C言語でファイルを読み込み、一部の要素を取り出してそれを演算しようとしています。

test.dat(読み込むファイル)

2017/5/1,spring,1 ,3800 2017/5/2,spring,2 ,1000 2017/5/3,spring,1 ,50 2017/5/4,spring,2 ,1079 2017/5/5,,1 ,3833  2017/5/7,,2 ,989 

実現したいこと

% ./trial test.dat 1 ,3800 2 ,1000 1 ,50 2 ,1079 1 ,3833 2 ,989 sum of third line is 1 =7683 sum of third line is 2 =3068

###発生している問題・エラーメッセージ
コードでは4列目の値をnum2として取得しているのですが、実行結果は全く異なる値が表示されます。
(コメントアウトしている部分は表示されていません)

% ./trial test.dat 1,6295600 2,6295600 1,6295600 2,6295600 1,6295600 2,6295600 sum of third line is 1 =18886800 //3列目が1の時の総和 sum of third line is 2 =18886800 //3列目が2の時の総和

###該当のソースコード

c

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(int argc, char *argv[]) { 5 FILE* fp; // ファイルポインタ 6 7 char *fname = argv[1]; 8 fp = fopen(fname, "r"); // ファイルを開く 9 10 char line[256]; 11 int num1, num2; 12 int sum1, sum2; // *追加 13 char *p; 14 int c; 15 16 //3列目と4列目の値を取得し、表示 17 sum1 = 0; // *追加 18 sum2 = 0; // *追加 19 while (fgets(line, sizeof(line), fp) != NULL) { 20 p = line; 21 c = 0; 22 while (p) { 23 if (*p == ',') c++; 24 p++; 25 if (c == 2) break; 26 } 27 sscanf(p, "%d,%d", &num1, &num2); // *変更 "%d,%d\n" -> "%d,%d" 28 printf("%d,%d\n", num1, num2); 29 30 //ここで総和を計算し、表示する 31 switch (num1) { 32 case 1: 33 sum1 += num2; // *変更 int 1sum -> sum1 34 break; 35 case 2: 36 sum2 += num2; // *変更 int 2sum -> sum2 37 break; 38 } 39 40 } 41 printf("sum of third line is 1 =%d\n", sum1); // *変更 1sum -> sum1 42 printf("sum of third line is 2 =%d\n", sum2); // *変更 2sum -> sum2 43 44 fclose(fp); 45 return 0; 46}

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

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

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

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

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

guest

回答2

0

ベストアンサー

ファイルの書式にsscanfの書式をあわせることで対応可能かと。

c

1sscanf(p, "%d,%d", &num1, &num2); 23sscanf(p, "%d ,%d", &num1, &num2); 4

投稿2018/01/17 01:35

ttyp03

総合スコア16996

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

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

退会済みユーザー

退会済みユーザー

2018/01/17 01:40

解決しました。迅速なご回答をいただきましてありがとうございます。
episteme

2018/01/17 01:49

うまくいったところに水を注すようで悪いんだけど、 アプリケーションがフォーマットを縛るのは感心しないな。 「カンマで区切ってさえあれば空白の有無は気にしない」のが望ましいカタチだと思う。
ttyp03

2018/01/17 01:55

わかります。 カンマ区切り単位で文字列で切り出して、atolでも使ったほうが良いのでしょう。 けど、質問者の過去の技量と、ファイルの書式が固定的な感じでしたので敢えてそうしてみました。 質問内容が「どんな書式でも柔軟に切り出す方法」とでもあれば別でしたが。
guest

0

sscanfは入力できた個数を返します。この値を一緒にprintfすると、いつも2にになってますか?

投稿2018/01/17 01:36

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問