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

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

ただいまの
回答率

90.52%

  • C

    3667questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 137

tenjin

score 213

前提・実現したいこと

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の時の総和

該当のソースコード

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  FILE* fp; // ファイルポインタ                                                 

  char *fname = argv[1];
  fp = fopen(fname, "r"); // ファイルを開く                                     

  char line[256];
  int num1, num2;
  int sum1, sum2; // *追加                                                      
  char *p;
  int c;

  //3列目と4列目の値を取得し、表示                                             
  sum1 = 0; // *追加                                                            
  sum2 = 0; // *追加                                                            
 while (fgets(line, sizeof(line), fp) != NULL) {
    p = line;
    c = 0;
    while (p) {
      if (*p == ',') c++;
      p++;
      if (c == 2) break;
    }
    sscanf(p, "%d,%d", &num1, &num2); // *変更 "%d,%d\n" -> "%d,%d"             
    printf("%d,%d\n", num1, num2);

    //ここで総和を計算し、表示する                                              
    switch (num1) {
    case 1:
      sum1 += num2; // *変更 int 1sum -> sum1    
      break;
    case 2:
      sum2 += num2; // *変更 int 2sum -> sum2                                   
      break;
    }

  }
  printf("sum of third line is 1 =%d\n", sum1); // *変更 1sum -> sum1         
  printf("sum of third line is 2 =%d\n", sum2); // *変更 2sum -> sum2  

  fclose(fp);
  return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

sscanf(p, "%d,%d", &num1, &num2);
↓
sscanf(p, "%d ,%d", &num1, &num2);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/17 10:40

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

    キャンセル

  • 2018/01/17 10:49

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

    キャンセル

  • 2018/01/17 10:55

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3667questions

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

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