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

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

ただいまの
回答率

90.84%

  • C

    3350questions

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

ファイル読み込みがうまくいかない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 63

ike-0315

score 4

私が書いたコード

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

int main(int argc,char *argv[]){
  int i,j,DIM;
  FILE *fp;
  char temp[100],n[100],c[100],t[100],e[100];

  if(argc !=2){
    printf("Usage: sample <input_filename>\n"); //引数が足りない時のエラー表示
    exit(1);
  }

  if((fp=fopen(argv[1],"r"))==NULL){//引数で指定されたファイル読み込み
    printf("file open error!\n");
    exit(1);
  }

  do{
    fscanf(fp,"%s",temp);
    if(strcmp("NAME",temp)==0){//NAMEの項目を読み込むまで空読み
      fscanf(fp,"%s",temp);
      break;
    }
    if(strcmp("NAME:",temp)==0)break;//NAMEの後に:が入っている場合の対処      
  }while(1);

  fscanf(fp,"%s",&n);//NAMEの読み込み
  printf("%s\n",n);

  do{
    fscanf(fp,"%s",temp);
    if(strcmp("COMMENT",temp)==0){//COMMENTの項目を読み込むまで空読み
      fscanf(fp,"%s",temp);
      break;
    }
    if(strcmp("COMMENT:",temp)==0)break;
    //COMMENTの後に:が入っている場合の対処      
  }while(1);

  fscanf(fp,"%s %s %s",&c);//COMMENTの読み込み
  printf("%s\n",c);

  do{
    fscanf(fp,"%s",temp);
    if(strcmp("TYPE",temp)==0){//TYPEの項目を読み込むまで空読み
      fscanf(fp,"%s",temp);
      break;
    }
    if(strcmp("TYPE:",temp)==0)break;
    //TYPEの後に:が入っている場合の対処      
  }while(1);

  fscanf(fp,"%s",&t);//TYPEの読み込み
  printf("%s\n",t);

  do{
    fscanf(fp,"%s",temp);
    if(strcmp("DIMENSION",temp)==0){//DIMENSIONの項目を読み込むまで空読み
      fscanf(fp,"%s",temp);
      break;
    }
    if(strcmp("DIMENSION:",temp)==0)break;
    //DIMENSIONの後に:が入っている場合の対処      
  }while(1);

  fscanf(fp,"%d",&DIM);//次元(都市数)の読み込み
  printf("%d\n",DIM);

  do{
    fscanf(fp,"%s",temp);
    if(strcmp("EDGE_WEIGHT_TYPE",temp)==0){//EDGE_WEIGHT_TYPEの項目を読み込むまで空読み
      fscanf(fp,"%s",temp);
      break;
    }
    if(strcmp("EDGE_WEIGHT_TYPE:",temp)==0)break;
    //EDGE_WEIGHT_TYPEの後に:が入っている場合の対処      
  }while(1);

  fscanf(fp,"%s",&e);//EDGE_WEIGHT_TYPEの読み込み
  printf("%s\n",e);

  do{
    fscanf(fp,"%s",temp);
    if(strcmp("NODE_COORD_SECTION",temp)==0){//NODE_COORD_SECTIONの項目を読込むまで空読み
      fscanf(fp,"%s",temp);
      break;
    }
    if(strcmp("NODE_COORD_SECTION",temp)==0)break;
  }while(1);

  int node[100][3];

  for(i=0;i<DIM;i++){
    fscanf(fp,"%d %d %d",&node[i][0],&node[i][1],&node[i][2]);
    //NODE_COORD_SECTIONの読み込み
  }      
  for(i=0;i<DIM;i++){
    printf("%2d %2d %2d\n",node[i][0],node[i][1],node[i][2]);
  }

  /*
  //コスト計算
  int cost[DIM][DIM];
  double x;
  for(i=0;i<DIM;i++){
    for(j=0;j<DIM;j++){
      x=sqrt(((node[i][2]-node[j][2])*(node[i][2]-node[j][2])
          +(node[i][3]-node[j][3])*(node[i][3]-node[j][3])));
      cost[i][j]=round(x);     
    }
  }
  for(i=0;i<DIM;i++){
    for(j=0;j<DIM;j++){
  printf("%3d ",cost[i][j]);
    }
    printf("\n");
  }

  //巡回路生成とコスト計算
  int TSPCost=0;
  for(i=0;i<DIM;i++){
    for(j=1;j<DIM+1;j++){
  TSPCost = TSPCost + cost[i][j%DIM];
    }
  }
  printf("TSPCost : %d\n",TSPCost);
  */
  fclose(fp);
}


読み込むデータ

NAME : eil51
COMMENT : 51-city problem (Christofides/Eilon)
TYPE : TSP
DIMENSION : 51
EDGE_WEIGHT_TYPE : EUC_2D
NODE_COORD_SECTION
1 37 52
2 49 49
3 52 64
4 20 26
5 40 30
6 21 47
7 17 63
8 31 62
9 52 33
10 51 21
11 42 41
12 31 32
13 5 25
14 12 42
15 36 16
16 52 41
17 27 23
18 17 33
19 13 13
20 57 58
21 62 42
22 42 57
23 16 57
24 8 52
25 7 38
26 27 68
27 30 48
28 43 67
29 58 48
30 58 27
31 37 69
32 38 46
33 46 10
34 61 33
35 62 63
36 63 69
37 32 22
38 45 35
39 59 15
40 5 6
41 10 17
42 21 10
43 5 64
44 30 15
45 39 10
46 32 39
47 25 32
48 25 55
49 48 28
50 56 37
51 30 40
EOF

この時NODE_COORD_SECTIONの最初の数"1"が読み込まれず、代わりに最後の数"40"のあとにゴミの数がプリントされてしまいます。

やったこと
読み込まれなかった"1"の前に適当な数を入れると意図した動作になりました。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

    if(strcmp("NODE_COORD_SECTION",temp)==0){//NODE_COORD_SECTIONの項目を読込むまで空読み
      fscanf(fp,"%s",temp);


これで、NODE_COORD_SECTIONが読まれた後、空読みされて捨てられますね

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/23 11:56

    早速の回答ありがとうございます!
    解決しました!!

    キャンセル

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

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

関連した質問

  • 解決済

    文字列の表示について

    身長 [cm] と体重 [kg] を標準入力して BMI を計算するプログラムを作りたいのですが BMI の値によって「やせ型」「標準型」「肥満型」の判 断と表示を行う(この部

  • 受付中

    c言語の課題に悩んでいます

    前提・実現したいこと 出力したファイル(a.txt)を読み込み、各行の合計値をファイル(b.txt)へ出力するプログラムを作成したいのですが上手くいきません。どなたか下記のプログ

  • 解決済

    オーバーフローします...

    前提・実現したいこと アルファベット順に表示したいです どうやったらアルファベット順に表示できますか? もし,このままでいいならオーバーフローを直して欲しいです... アル

  • 解決済

    現在開いているEdgeのURLとタイトルを取得したいです。

    こんにちは。  Windows10でC#のアプリケーションを開発しています。  Visual Studio 2017 Communityを使っています。  前提・実現したいこと

  • 解決済

    c言語 リスト構造について...

    前提・実現したいこと 最近C言語でリスト構造を勉強したので自己流でリスト構造のプログラムを作成したのですが正常に作動しません。どなたか解決法を教えてください。 説明不足だったの

  • 解決済

    数字(文字)が何も書かれていない、を表現するのにNULLであってるのか

    前提・実現したいこと C言語を使って,「input.txtに1個以上の実数が1行に1つずつ改行を挟んで書かれているとき, 記載されている実数をすべて読み込み,数値の合計,数値の個数

  • 解決済

    c言語の文字列のfor文の書きかたについて

     前提・実現したいこと エラーの処理 c言語の課題でパスワード一致確認のプログラムを作っていますが エラーが発生してしまいました。 Main.c:9:38: error: ex

  • 受付中

    c言語のif文について

    c言語のif文の条件について 最近c言語の勉強をし始めたものです 以下のようなif文の条件の書き方を教えてください。 キーボード入力(key)から 自然数を入力→ ● a を入

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

  • C

    3350questions

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