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

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

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

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

Q&A

解決済

1回答

1922閲覧

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

ike-0315

総合スコア30

C

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

0グッド

0クリップ

投稿2018/05/23 02:45

私が書いたコード

c

1#include<stdio.h> 2#include<stdlib.h> 3#include<math.h> 4 5int main(int argc,char *argv[]){ 6 int i,j,DIM; 7 FILE *fp; 8 char temp[100],n[100],c[100],t[100],e[100]; 9 10 if(argc !=2){ 11 printf("Usage: sample <input_filename>\n"); //引数が足りない時のエラー表示 12 exit(1); 13 } 14 15 if((fp=fopen(argv[1],"r"))==NULL){//引数で指定されたファイル読み込み 16 printf("file open error!\n"); 17 exit(1); 18 } 19 20 do{ 21 fscanf(fp,"%s",temp); 22 if(strcmp("NAME",temp)==0){//NAMEの項目を読み込むまで空読み 23 fscanf(fp,"%s",temp); 24 break; 25 } 26 if(strcmp("NAME:",temp)==0)break;//NAMEの後に:が入っている場合の対処 27 }while(1); 28 29 fscanf(fp,"%s",&n);//NAMEの読み込み 30 printf("%s\n",n); 31 32 do{ 33 fscanf(fp,"%s",temp); 34 if(strcmp("COMMENT",temp)==0){//COMMENTの項目を読み込むまで空読み 35 fscanf(fp,"%s",temp); 36 break; 37 } 38 if(strcmp("COMMENT:",temp)==0)break; 39 //COMMENTの後に:が入っている場合の対処 40 }while(1); 41 42 fscanf(fp,"%s %s %s",&c);//COMMENTの読み込み 43 printf("%s\n",c); 44 45 do{ 46 fscanf(fp,"%s",temp); 47 if(strcmp("TYPE",temp)==0){//TYPEの項目を読み込むまで空読み 48 fscanf(fp,"%s",temp); 49 break; 50 } 51 if(strcmp("TYPE:",temp)==0)break; 52 //TYPEの後に:が入っている場合の対処 53 }while(1); 54 55 fscanf(fp,"%s",&t);//TYPEの読み込み 56 printf("%s\n",t); 57 58 do{ 59 fscanf(fp,"%s",temp); 60 if(strcmp("DIMENSION",temp)==0){//DIMENSIONの項目を読み込むまで空読み 61 fscanf(fp,"%s",temp); 62 break; 63 } 64 if(strcmp("DIMENSION:",temp)==0)break; 65 //DIMENSIONの後に:が入っている場合の対処 66 }while(1); 67 68 fscanf(fp,"%d",&DIM);//次元(都市数)の読み込み 69 printf("%d\n",DIM); 70 71 do{ 72 fscanf(fp,"%s",temp); 73 if(strcmp("EDGE_WEIGHT_TYPE",temp)==0){//EDGE_WEIGHT_TYPEの項目を読み込むまで空読み 74 fscanf(fp,"%s",temp); 75 break; 76 } 77 if(strcmp("EDGE_WEIGHT_TYPE:",temp)==0)break; 78 //EDGE_WEIGHT_TYPEの後に:が入っている場合の対処 79 }while(1); 80 81 fscanf(fp,"%s",&e);//EDGE_WEIGHT_TYPEの読み込み 82 printf("%s\n",e); 83 84 do{ 85 fscanf(fp,"%s",temp); 86 if(strcmp("NODE_COORD_SECTION",temp)==0){//NODE_COORD_SECTIONの項目を読込むまで空読み 87 fscanf(fp,"%s",temp); 88 break; 89 } 90 if(strcmp("NODE_COORD_SECTION",temp)==0)break; 91 }while(1); 92 93 int node[100][3]; 94 95 for(i=0;i<DIM;i++){ 96 fscanf(fp,"%d %d %d",&node[i][0],&node[i][1],&node[i][2]); 97 //NODE_COORD_SECTIONの読み込み 98 } 99 for(i=0;i<DIM;i++){ 100 printf("%2d %2d %2d\n",node[i][0],node[i][1],node[i][2]); 101 } 102 103 /* 104 //コスト計算 105 int cost[DIM][DIM]; 106 double x; 107 for(i=0;i<DIM;i++){ 108 for(j=0;j<DIM;j++){ 109 x=sqrt(((node[i][2]-node[j][2])*(node[i][2]-node[j][2]) 110 +(node[i][3]-node[j][3])*(node[i][3]-node[j][3]))); 111 cost[i][j]=round(x); 112 } 113 } 114 for(i=0;i<DIM;i++){ 115 for(j=0;j<DIM;j++){ 116 printf("%3d ",cost[i][j]); 117 } 118 printf("\n"); 119 } 120 121 //巡回路生成とコスト計算 122 int TSPCost=0; 123 for(i=0;i<DIM;i++){ 124 for(j=1;j<DIM+1;j++){ 125 TSPCost = TSPCost + cost[i][j%DIM]; 126 } 127 } 128 printf("TSPCost : %d\n",TSPCost); 129 */ 130 fclose(fp); 131}

読み込むデータ

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"の前に適当な数を入れると意図した動作になりました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

C

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

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

投稿2018/05/23 02:51

y_waiwai

総合スコア87719

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

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

ike-0315

2018/05/23 02:56

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問