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

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

ただいまの
回答率

90.76%

  • C

    3461questions

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

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

解決済

回答 4

投稿

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

ranranway

score 198

前提・実現したいこと

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

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

2018/01/15, Jan, 1, 10
2018/01/16, , 2, 10
2018/01/17, Jan, 1, 30
2018/01/18, Jan, 2, 15

実現したいこと(コメントアウトしている部分は表示しません)

./trial test.dat
1, 10 
2, 10
1, 30
2, 15
1  40 //3列目が1の時、4列目の総和は10+30=40
2  25 //3列目が2の時、4列目の総和は10+15=25

発生している問題・エラーメッセージ

発生しているエラーを読んでも理解できないため、アドバイスをいただけると幸いです。

trial.c: In function ‘main’:
trial.c:28:7: error: a label can only be part of a statement and a declaration is not a statement
       int 1sum += num2;
       ^
trial.c:28:11: error: invalid suffix "sum" on integer constant
       int 1sum += num2;
           ^
trial.c:28:11: error: expected identifier or ‘(’ before numeric constant
trial.c:31:7: error: a label can only be part of a statement and a declaration is not a statement
       int 2sum += num2;
       ^
trial.c:31:11: error: invalid suffix "sum" on integer constant
       int 2sum += num2;
           ^
trial1_15.c:31:11: error: expected identifier or ‘(’ before numeric constant
trial.c:34:42: error: invalid suffix "sum" on integer constant
     printf("sum of line three is 1 =%d", 1sum);
                                          ^
trial.c:35:42: error: invalid suffix "sum" on integer constant
     printf("sum of line three is 2 =%d", 2sum);
                                          ^

該当のソースコード

 #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;
  char *p;
  int c;
//3列目と4列目の値を取得し、表示
  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\n", &num1, &num2);
    printf("%d,%d\n", num1, num2);

//ここで総和を計算し、表示する
    switch(num1){
      case 1:
      int 1sum += num2;
      break;
      case 2:
      int 2sum += num2;
      break;
      }
      printf("sum of line three is 1 =%d", 1sum);
      printf("sum of line three is 2 =%d", 2sum);
  }

  fclose(fp);
  return 0;
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

+3

こんにちは。

エラーの部分だけしかみてませんが、この行だけで3つ程誤りがあります。

  1. invalid suffix "sum" on integer constant
    「整数型の定数のサフィックス(後ろに付けた何か)として"sum"は間違っている」というエラーメッセージです。1は整数型の定数(integer constant)です。それに続けて"sum"を書いているのでサフィックスとして解釈され、このようなエラーメッセージになったのだと思います。
    このエラーを取るだけなら、int sum1 += num2;でしょう。(しかし、他のエラーが入り込みますので後述します。)

  2. a label can only be part of a statement and a declaration is not a statement
    これは「ラベルは文の一部です。宣言は文ではありません」というエラー・メッセージですね。(宣言文は実行文ではないと表現したほうが判りやすいメッセージのような気がしますので、ちょっと不親切なエラーメッセージかも。)
    int xxx=123;のような記述は、int型変数xxxを宣言し、整定数123で初期化するという意味です。
    一見実行文のようにも見えますが、そうではなく初期化付きの変数を宣言する文です。
    そして、caseラベルは実行文の先頭に付くものと決まっているため、不正なのです。

  3. int sum1 += num2;
    これは間違いです。int型変数sum1を宣言していますが、この宣言文に += の構文は存在しません。また、もし、文法的に許されていたとしても、sum1を宣言しただけで初期化していませんので不定値(どんな値になるか解らない)になります。その不定値にnum2を加えても不定値のままです。意味がありません。

なお、expected identifier or ‘(’ before numeric constantについては深く考えない方が良いです。
この前のエラーのせいでコンパイラが混乱しているようです。この前のエラーを適切に修正すれば消える筈です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/16 21:02

    ご丁寧に説明いただきましてありがとうございます。大変勉強になりました。

    キャンセル

+2

変数名の先頭に数字はつけられません。
名前を変えましょう。
またswitch文の中で変数の宣言をしていますが、switch文の中でしかその変数は使えません。
C言語のスコープを学びましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/16 21:15

    ご回答いただきましてありがとうございます。

    キャンセル

+1

trial.c:28:11: error: invalid suffix "sum" on integer constant
    int 1sum += num2;

Cでは、変数名の先頭が数字になることを認めていません。
参考書の最初の何ページ目かに書いてある内容かと思いますが。

『invalid suffix "sum" on integer constant』⇒『sumの先頭に定数整数を付けちゃだめよ』
エラーメッセージは読めるようになりましょうね。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/16 13:18

    『sumの先頭に定数整数を付けちゃだめよ』ではなく『定数整数の後ろにsumを付けちゃだめよ』ですね。
    意味合い的には近くても正確さにかけました。

    キャンセル

  • 2018/01/16 21:15

    ご回答いただきましてありがとうございます。

    キャンセル

checkベストアンサー

0

簡単に添削します。
単にコンパイルエラーがでないようにしただけなので期待どおり動くかどうかは知りません。
エラーが大量に出ている状態だと勉強にならないので、一つずつ元の状態に戻してどこからどんなコンパイルエラーが出るのか確認しておくと勉強になると思います。
(エラーとは関係ありませんが、"sum of line three is 1"というでたらめな英語を使うくらいならばいっそ日本語にしたほうがいいですよ。)

#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 line three is 1 =%d", sum1); // *変更 1sum -> sum1
        printf("sum of line three is 2 =%d", sum2); // *変更 2sum -> sum2
    }

    fclose(fp);
    return 0;
}

// *削除 }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/16 21:02

    ご回答いただきましてありがとうございます。
    現状では総和の部分に段落を加えて
    1,10
    sum of line three is 1 =10
    sum of line three is 2 =0
    2,10
    sum of line three is 1 =10
    sum of line three is 2 =10
    1,30
    sum of line three is 1 =40
    sum of line three is 2 =10
    2,15
    sum of line three is 1 =40
    sum of line three is 2 =25
    というように表示することができました。

    キャンセル

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

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

関連した質問

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

  • C

    3461questions

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

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