• ベストアンサー

ファイル入力

1 20 2 30 3 95 4 52 5 90 3 Maximum  上記の様な入力ファイルinput.datのうち1~5行目のデータを表示するプログラムを作っています。  6行目は空白で、7行目は2列目の中で最大値をとる行の1列目の数値が入っています。  1列目の数値は最後の行を除いて重複することはありません。  入力データの行数はファイルによって最大20行まで変動します。列数は2列で固定です。  以下のプログラムのままでは6行目以降のデータも読み取ってしまい、出力がおかしくなってしまいます。  1~5行目のデータのみ出力するにはどうしたらよいでしょうか。  ご存知の方、お手数ですが教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define row 20 #define col 2 int main(){ int i,j,data[20][2]; FILE *fp; if((fp=fopen("input.dat","r"))==NULL){ fprintf(stderr,"Cannot open file input.dat\n"); exit(1); } for(i=0;i<row;i++){ for(j=0;j<col;j++){ fscanf(fp,"%d",&data[i][j]); printf("%d ",data[i][j]); } printf("\n"); } fclose(fp); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.8

>ご回答いただいたプログラムを参考に下記のように作ってみましたがどうでしょうか。 停止条件の行を読み込むために、20行のデータがあるとdata[20][0]に読み込み配列領域を超えてしまいます。 for (i = 0; i < row; i++)で切ったほうが安全です。 BLUEPIXYさんがおっしゃるとおり、 fscanf(fp, "%d %d", &data[i][0], &data[i][1]) は、終了条件以外でも!=1になりうるので危険です。 #include <stdio.h> #include <stdlib.h> #include <errno.h> #define row 20 #define col 2 int main(){ int i,j, data[row][col]; FILE *fp; char buf[BUFSIZ]; if ((fp = fopen("input.dat", "r")) == NULL) { fprintf(stderr, "Cannot open file input.dat\n"); exit(errno); } for (i = 0; i < row; i++) { if (fgets(buf, BUFSIZ, fp) == 0 || buf[0] == '\n' || sscanf(buf, "%d %d", &data[i][0], &data[i][1]) != 2) break; } for (j = 0; j < i; j++) { printf("%d %d\n", data[j][0], data[j][1]); } fclose(fp); return 0; }

eliteyoshi
質問者

お礼

何度もご回答していただきありがとうございました。 今回質問させていただき、理解することができました。C言語の勉強をこれからも続けていきたいと思います。

その他の回答 (7)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

>>exit使っていることはどうなんだ >すみません。exitを使ってはいけないんでしょうか? 使ってはいけないということではないです。 あんまり気にされませんように・ exitを使うと、自動的に登録した終了処理をしてくれたりして便利ですよね。 int mainなのに、voidで終わるのはどうなのぐらいの意味です。 例外的な終了なんだからいいんだ!で済む話です。 余計なことを言ってすみませんです ついでに #6お礼>while(fscanf(fp, "%d %d", &data[i][0], &data[i][1]) != 1) { ですが、fscanfの返した値の要素数で、ループの終了条件にするのはあまりいいとは思えません。 fscanfが何らかの理由でエラーを返すような状態になった時、無限にループすることになります。

eliteyoshi
質問者

お礼

何度もご回答していただきありがとうございました。 今回でかなり勉強になりました。これからもC言語の勉強を続けていきます。

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.6

>もしおかしな点があればご指摘お願いします。 定義した変数jが使われていません。 data[row][col]に読み込んだデータは本番では使うのでしょうか? 使わなければ、配列に読み込む意味はありません。 Maximumとの一致を停止条件にするのは、不経済で、安全性に欠けます。 せっかく空行があるのだから、fscanf()の戻り値を有効に活用すべきです。 #include <stdio.h> #include <stdlib.h> #include <errno.h> #define row 20 #define col 2 int main() { int i, data[row][col]; FILE *fp; if ((fp = fopen("input.dat", "r")) == NULL) { fprintf(stderr, "Cannot open file input.dat\n"); exit(errno); } for (i = 0; i < row; i++) { if (fscanf(fp, "%d %d", &data[i][0], &data[i][1]) != 2) break; printf("%d %d\n", data[i][0], data[i][1]); } fclose(fp); return 0; }

eliteyoshi
質問者

お礼

何度もご回答ありがとうございます。 data[row][col]に読み込んだデータは本番で使います。 ご回答いただいたプログラムを参考に下記のように作ってみましたがどうでしょうか。 #include <stdio.h> #include <stdlib.h> #include <errno.h> #define row 20 #define col 2 int main(){ int i=0,j, data[row][col]; FILE *fp; if ((fp = fopen("input.dat", "r")) == NULL) { fprintf(stderr, "Cannot open file input.dat\n"); exit(errno); } while(fscanf(fp, "%d %d", &data[i][0], &data[i][1]) != 1) { i++; } for (j = 0; j < i; j++) { printf("%d %d\n", data[j][0], data[j][1]); } fclose(fp); return 0; }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

>プログラムを見ていただけるとありがたいです。 exit使っていることはどうなんだとか、hitって名前はどうなのみたいなこと(毎回hit++しないでも、hit==0の時だけhit=1すればいいんじゃないの)とかは、流儀みたいな話なので、そんなことを除けば、 仕様の範囲内でちゃんと動くし特に問題ないと思います。

eliteyoshi
質問者

お礼

何度もありがとうございます。 言われてみれば、hit=0の時だけhit++すればよいですね。 >exit使っていることはどうなんだ すみません。exitを使ってはいけないんでしょうか?

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.4

>このままでは入力ファイルの行数が変化すると対応できないと思うのですが・・・。 データー行が変動しても「最初の5行」を出力するプログラム化と思いました。空行の前までを出力するプログラムなのですね。 #include <stdio.h> #include <stdlib.h> #include <errno.h> int main(void) { char buf[BUFSIZ]; int i, j, k; FILE *fp; if ((fp = fopen("input.dat", "r")) == NULL) { fprintf(stderr, "Cannot open file input.dat\n"); exit(errno); } for (;;) { fgets(buf, BUFSIZ, fp); if (sscanf(buf, "%d %d", &j, &k) != 2) break; fputs(buf, stdout); } fclose(fp); return 0; }

eliteyoshi
質問者

お礼

 再びご回答ありがとうございます。  mac_resさんのプログラムは本を見ながらなんとか理解できました。まだまだ勉強不足だと感じています。  No.3のお礼に自分なりに作ったプログラムをのせましたので、もしおかしな点があればご指摘お願いします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#include <stdio.h> #include <stdlib.h> #include <ctype.h> #define row 20 #define col 2 #define BUFFSIZE 1024 int main(){ int i,j,data[row][col]; FILE *fp; char buff[BUFFSIZE]; if((fp=fopen("input.dat","r"))==NULL){ fprintf(stderr,"Cannot open file input.dat\n"); exit(1); } for(i=0;i<row;i++){ if(NULL==fgets(buff, BUFFSIZE, fp))break; if(isspace(*buff))break; sscanf(buff,"%d %d",&data[i][0], &data[i][1]); printf("%d %d\n",data[i][0], data[i][1]); } fclose(fp); return 0; } --------------------------------------------------------------- って感じですかね。 col は、#defineされていること、配列のサイズになっていることからすると、決め打ちしてもいいと思うけど、 1つずつ読み込む必要があるなら、strtokとatoiとかを使えばいいと思います。

eliteyoshi
質問者

お礼

 再びご回答ありがとうございます。  C言語はまだまだ初心者レベルなので分からない事だらけです。BLUEPIXYさんのプログラムは本で調べながら何とか理解できました。今の時点の自分の実力で今日半日かけて作ったプログラムを見ていただけるとありがたいです。最後の行の1列目が、2列目の最大値の行の1列目と同一ということに着目しました。 #include <stdio.h> #include <stdlib.h> #define row 20 #define col 2 int main(){ int i,j,max_no,max,hit=0,data[row][col]; FILE *fp; if((fp=fopen("input.dat","r"))==NULL){ fprintf(stderr,"Cannot open file input.dat\n"); exit(1); } for(i=0;i<row;i++) { fscanf(fp,"%d %d",&data[i][0],&data[i][1]); if(hit==0){ max_no=data[i][0]; max=data[i][1]; } else if(max_no==data[i][0]){ break; } else if(max<data[i][1]){ max_no=data[i][0]; max=data[i][1]; } printf("%d %d\n",data[i][0],data[i][1]); hit++; } fclose(fp); return 0; }

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

#include <stdio.h> #include <stdlib.h> #include <errno.h> int main(void) { char buf[BUFSIZ]; int i; FILE *fp; if ((fp = fopen("input.dat", "r")) == NULL) { fprintf(stderr, "Cannot open file input.dat\n"); exit(errno); } for (i = 0; i < 5; i++) { fgets(buf, BUFSIZ, fp); fputs(buf, stdout); } fclose(fp); return 0; }

eliteyoshi
質問者

補足

ご回答ありがとうございます。 作っていただいたプログラムは非常に参考になりましたが、このままでは入力ファイルの行数が変化すると対応できないと思うのですが・・・。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

いきなり fscanfで読み込むのではなくて、 一行読み込んで、 行の先頭が'\n'とか' 'とかあるいは数字でないとかでブレイクするようにして、 fscanfは、sscanfに置き換えるというのはどうでしょう

eliteyoshi
質問者

補足

ご回答ありがとうございます。 sscanfは使ったことがないので、調べてみます。

関連するQ&A

  • c言語についての質問です

    #include<stdio.h> #define N 3 void inputAns(int *row,int *col,int data[][N]); void printAns(int ID,int data[][N]); int main(){ int row[N]={2,3,6},col[N]={8,5,3},answer[N][N]; int i,ID; printf("Input your ID number :\n"); scanf("%d",&ID);inputAns(row,col,answer); printAns(ID,answer); return(1); } void inputAns(int *row,int *col,int data[][N]){ int i,j; printf(" Input Answers of matrxi Q :\n"); for(i=0;i<N;i++){ for(j=0; j<N; j++){ printf("%2d+%2d=",row[i],col[j]); scanf("%d",&data[i][j]); } } } void printAns(int ID, int data[][N]){ FILE *fp; int i,j; fp=fopen("ans.dat","a+t"); fprintf(fp,"%d\n",ID); for(i=0; i<N; i++){ for(j=0; j<N; j++) fprintf(fp," %3d",data[i][j]); fprintf(fp,"\n"); } fclose(fp); } この百マス計算のプログラムの28行目からを書き換えて以下のような画面出力を求めたいです。 >./a.exe ID=50413001 [ 9/9 ] ID=50413002 [ 5/9 ] ID=50413003 [ 7/9 ] ID=50413004 [ 6/9 ] ID=50413005 [ 5/9 ] == correct rate === 4/5 3/5 5/5 5/5 1/5 4/5 4/5 1/5 5/5 =================== > 読み込むファイル(ans.dat)は以下のものです。 50413001 10 7 5 11 8 6 14 11 9 50413002 10 7 5 11 9 5 13 10 9 50413003 10 7 5 11 5 6 14 10 9 50413004 10 11 5 11 5 6 14 10 9 50413005 9 11 5 11 5 6 14 10 9 読み込みから集計がうまくいかず困っています。 どなたか教えてくれませんか?

  • csvファイルを読み込んで二次元配列に格納したい

    200×250のある数字と文字の入力されたcsvファイル(またはtxtファイル)を読み込んで2次元配列に格納したいのです。 色々調べるとカンマの処理が必要ということがわかりましたが、どのようにソースを書けばよいかわかりません。使用言語はC言語です。 また、実際にcsvファイルを読み込むようにプログラムを書いてみましたが、すべて-858993460となって表示されます。 プログラミング初心者で勉強中なため困っています。 回答よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define row 200 #define column 250 int main() { int i, j; int data[row][column]; FILE *fp; fp = fopen("sample.csv", "r"); if (fp == NULL){ printf("ファイルがありません\n"); return 1; } for (i = 0; i < row; i++){ for (j = 0; j < column; j++){ fscanf(fp, "%lf", &data[i][j]); } } for (i = 0; i<row; i++){ for (j = 0; j < column; j++){ printf("%3d ", data[i][j]); } printf("\n"); } fclose(fp); return 0; }

  • 行列の積を計算するプログラムがうまくいきません

    どこが間違っているのかわかる方お願いします ・行列A,Bはファイルから読み込む ・行列A,Bの積Cの計算には関数を用いる #include<stdio.h> #define ROW 10 #define COL 10 void MatrixProduct(int a[][COL],int b[][ROW],int c[][ROW],int n,int m ) { int i,j,k; for(i=0;i<n;i++){ for(j=0;j<n;j++){ c[i][j]=0; } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ c[i][j]=c[i][j]+a[i][k]*b[k][j]; } } } } int main(void) { FILE *fp1,*fp2; char fname1[64],fname2[64]; int a[ROW][COL],b[ROW][COL],c[ROW][COL],n,m; int i,j,k; printf("Input file name ?"); scanf("%s",fname1); printf("Output file name ?"); scanf("%s",fname2); fp1=fopen(fname1,"r"); fp2=fopen(fname2,"w"); fscanf(fp1,"%d %d",&n,&m); MatrixProduct(a,b,c,n,m); for(i=0;i<n;i++){ for(j=0;j<n;j++){ fprintf(fp2,"%3d",c[i][j]); } fprintf(fp2,"\n"); } fclose(fp1); fclose(fp2); return(0); } fp1 3 4 1 2 3 4 2 3 4 5 3 4 5 6 1 2 3 2 3 4 3 4 5 4 5 6

  • datファイルの読み込み

    初歩的な質問ですみません。 今、819200行のファイルをfscanfで読み込んで配列に格納しているのですが、実行してみるとBus errorが出力されてしまい、うまく格納できません。どなたか至急教えてもらえませんか? ***************************ソース************************************************************ #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #define pi 3.1415926535 //円周率 #define FILE_SIZE 819200 #define FILE_NAME "test.dat" struct Data{ int time; double voltage; double velocity; double pressure; double trigger; }; int main() { int k,n,N,i=0,j; struct Data dat[FILE_SIZE]; FILE *fp1; FILE *fp2; if ((fp1 = fopen(FILE_NAME,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } //データの読み込み while((fscanf(fp1, "%d %lf %lf %lf %lf",dat[i].time,dat[i].voltage,dat[i].velocity,dat[i].pressure,dat[i].trigger)) !=EOF ){ i++; } fclose(fp1); return 0; } ***************************************************************************************** ********************test.datファイル********************************************** -2.64316 2.329595 0.697657 0.001373 -4.861982 -2.64314 2.325628 0.671961 0.001984 -4.744793 -2.64312 2.320745 0.640333 0.001678 -4.659953 -2.64310 2.319829 0.634400 0.002289 -4.707866 -2.64308 2.319219 0.630449 0.002289 -4.699321 -2.64306 2.317082 0.616607 0.002594 -4.532387 . . . . . *********************************************************************************** 環境はmac osです。 よろしくおねがい致します。

  • 入力ファイルのデフォルトの設定

    下のソースは入力ファイルの内容が例えば、 1 2 3 4 5 6 7 8 の時にその内容を出力するものです。 入力ファイル名がinput.datの場合、プログラム実行後にinput.datと入力し、Enterを押します。 このプログラムにinput.datをデフォルトとし、空Enterで入力を実行できるようにしたいと考えています。 入力ファイル名がinput.datでない場合は従来通りファイル名を入力してEnterを押すようにします。 この場合、どのようにソースを変更すればよいでしょうか。お手数ですが、教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(){ int i,N=0,data[10]; char ifile[20]; FILE *fp; printf("input file name: "); scanf("%s",ifile); if((fp=fopen(ifile,"r"))==NULL){ fprintf(stderr,"input file error\n"); exit(1); } while(fscanf(fp,"%d",&data[N])!=EOF && N<10){ N++; } printf("Total Number of Data = %d\n",N); for(i=0;i<N;i++){ printf("%d\n",data[i]); } fclose(fp); return 0; }

  • 転置行列と行列の和

    初めまして。 大学の授業でプログラミングのC言語を勉強しています。 4月からプログラミングを始めたばかりで、まったくの初心者です。 転置行列が作れなくて困っているのですが、 .datのファイルから転置させるのが上手くできません。 《kadai1.datの3行4列の行列Aと、kadai2.datの4行3列行列Bがある。 行列A、行列B、行列Aの転置行列を出力し、 行列Aの転置行列と行列Bの和を出力するプログラムを作る。 kadai1.datとkadai2.datは自分で作る。》 で、途中まで作ったのが以下です。 #include <stdio.h> #include <stdlib.h> #define ROW   3 #define COLUMN 4 int main(void) { FILE *fp; double a[ROW][COLUMN], b[ROW][COLUMN]; int i, j; if ( ( fp = fopen( "kadai1.dat", "r" ) ) == NULL ) { printf("ファイルが見つかりません : kadai1.dat \n"); exit(1); } printf("行列Aは次の通りです\n"); for ( i = 0 ; j < COLUMN ; j++) { scanf (fp, "%lf", &a[i][j]); printf ("%5.2f\t", a[i][j]); } printf("\n"); } if ( ( fp = fopen( "kadai2.dat", "r" ) ) == NULL ) { printf("ファイルが見つかりません : kadai2.dat \n"); exit(1); } printf("行列Bは次の通りです\n"); for ( i = 0 ; j < COLUMN ; j++) { scanf (fp, "%lf", &a[i][j]); printf ("%5.2f\t", a[i][j]); } printf("\n"); } return 0; } \の半角が出なかったので¥になってます。 (ごめんなさい!!) 上のプログラムで、行列Aと行列Bが出力できたのですが、転置と和のプログラムが出来ていません。 kadai1.datが、 1 2 3 4 5 6 7 8 9 10 11 12 kadai2.datが、 13 14 15 16 17 18 19 20 21 22 23 24 にしてみました。a1 a2 … c3 c4、でやってる人もいるみたいですが具体的な数字で作ろうと思っています。 お手数おかけしますが具体的にお答えいただければ幸いです。 どうぞよろしくお願いいたします。

  • 漢字を配列に入れたいのですが

    漢字を配列に入れたいのですが、うまくいきません。 3列、60行のcsvファイルを読み込んで配列に入れようをしているのですが、1列目、2列目、3列目にある漢字をそれぞれ配列に入れようとしているのですが、出力するとうまくいかないんです。誰か教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXBUFFSIZE 256 #define MAXWORDS 15 int split(char* words[], int length, char* split_ch,char* str){ int i,j; for(i=0;i<length;i++){ if((words[i] = strtok(str,split_ch))==NULL)break; str=NULL; } return(i); } int main(int argc, char* argv[]){ if(argc !=2){ printf("入力エラー"); return(0); } FILE *fp; char *ll, *words[MAXWORDS], ch, buff[MAXBUFFSIZE]; int i,j; unsigned int data1[60], data2[60], data3[60]; if((fp =fopen(argv[1],"r"))==NULL){ printf("ファイルが開けません。\n"); } j=0; ll= fgets(buff,MAXBUFFSIZE,fp); while((ll= fgets(buff,MAXBUFFSIZE,fp)) != NULL){ split(words, MAXWORDS, ",",ll); data1[j] = words[0]; data2[j] = words[1]; data3[j] = words[2]; j++; } printf("%s\n%s\n%s\n", data1,data2,data3); }

  • csvファイルの読み込み

    fscanf関数を用いて、csvファイルの内容を構造体のそれぞれのメンバに読み込んで表示させようとしているのですが、4列目以降が上手く読み込めません。初歩的な質問で申し訳ありませんがどなたか教えてください。 ****************************ソース************************************************ #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 64 #define FILE_NAME "view_001_McdlData.csv" #define FILE_SIZE 819200 struct Data{ int DataNo; int FrameNo; int SampleNo; char Digital; double voltage; double trigger; double C; double D; }; int main(int argc, char *argv[]) { FILE* fp,*fo, *fi; // ファイルポインタ用 int n, i, file_size; double time,vel[FILE_SIZE]; struct Data *dat; char buff[SIZE]; if ((fp = fopen(FILE_NAME,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } fseek(fp, 0, SEEK_END); file_size = ftell(fp); dat = (struct Data*)malloc(file_size); printf("malloc address= %p, file size= %d\n", dat, file_size); fseek(fp, 0, SEEK_SET); i = 0; //データの読み込み while((fscanf(fp, "%d,%d,%d,%s,%lf,%lf,%lf,%lf",&dat[i].DataNo,&dat[i].FrameNo,&dat[i].SampleNo,&dat[i].Digital,&dat[i].voltage,&dat[i].trigger,&dat[i].C,&dat[i].D)) !=EOF ){ printf("%d %d %d %s %lf %lf %lf %lf\n",dat[i].DataNo,dat[i].FrameNo,dat[i].SampleNo,dat[i].Digital,dat[i].voltage,dat[i].trigger,dat[i].C,dat[i].D); i++; } fclose(fp); return 0; } ***********************************csvファイルの内容************************************ 0,1,0,0x3F,2.270000,0.000000,-1.000000,-1.000000 1,1,1,0x3F,2.260000,0.010000,-1.000000,-1.000000 2,1,2,0x3F,2.260000,0.010000,-1.000000,-1.000000 3,1,3,0x3F,2.260000,0.010000,-1.000000,-1.000000 4,1,4,0x3F,2.260000,0.010000,-1.000000,-1.000000 5,1,5,0x3F,2.260000,0.000000,-1.000000,-1.000000 ***************************************************************************************************

  • CSVファイルの読み込み

    以下のようなCSVファイルを読み込みたいと思っています。 0.575092,0.030525 0.565324,0.018315 0.555556,0.013431 0.553114,0.013431 0.54823,0.015873 0.538462,0.013431 0.531136,0.006105 0.52381,-0.003663 0.516484,-0.010989 0.501832,-0.015873 0.489622,-0.018315 0.477412,-0.020757 0.46276,-0.020757 ・ ・ ・ 50000*2のデータで、以下のようなプログラムを使用しました。 #include <stdio.h> #include <stdlib.h> #include <string.h> /* 確保するデータ保存領域の大きさ(N行×M列) */ #define N 50000 #define M 2 /* データの区切り文字 */ #define SEP_DATA ',' int csv_read(char filename[], double csv[N][M]) { /* ファイルオープン */ FILE *fp; if( (fp = fopen(filename, "r")) == NULL ) { printf(" file open error!!\n"); return -1; } /* 1行毎に読み出し */ char line[256], *ptr; int i, j, k; i=0; while (fgets(line, 256, fp) != NULL) { printf("*%s", line); ptr = line; j=0; do{ /* line[j]から次のタブ文字までを数値に変換 */ csv[i][j] = atof(ptr); /* 次のタブ文字の位置を探す */ ptr = strchr(ptr, SEP_DATA); /* タブ文字の次の文字を示す */ if (ptr!=NULL) { ptr++; } j++; }while(ptr!=NULL && j<M); i++; } /* ファイルクローズ */ fclose(fp); return 0; } int main(int argv, char *argc[]) { char filename[256]; if( argv > 1){ strcpy(filename, argc[1]); } else { printf("Please Input Filename:"); scanf("%s", filename); } /* データ保存用の領域を確保 */ double (*csvdata)[M]; csvdata = (double(*)[M])malloc(sizeof(csvdata) * N); if ( csvdata == NULL ){ return -1; } int i,j; /* 配列の初期化 */ for( i=0; i<N; i++) { for( j=0; j<M; j++) { csvdata[i][j] = 0.0; } } /* CSVデータの読み込み */ if( csv_read(filename, csvdata) < 0 ) { return -1; } /* 配列の出力 */ for( i=0; i<N; i++) { printf("%lf", csvdata[i][0]); for( j=1; j<M; j++) { printf("\t%lf", csvdata[i][j]); } printf("\n"); } free(csvdata); csvdata = NULL; return 0; } しかし、コンパイルは通るのですが実行時にエラーが出てしまいます。 データの大きさに問題があると思うのですが、原因がわかりません。おかしな所のご指摘を頂きたいです。よろしくお願いします。

  • 型によらないCSVファイルの読み込みC言語プログラ

    あらかじめ型のわかっているN行*M列のエクセルデータをCSV形式にし、 読み込むプログラムを作成しました。 そのプログラムを下に示します #include <stdio.h> #include <stdlib.h> #include <string.h> /* 確保するデータ保存領域の大きさ(N行×M列) */ #define N 23 #define M 6 /* データの区切り文字 */ #define SEP_DATA ',' int csv_read(char filename[], double csv[N][M]) { /* ファイルオープン */ FILE *fp; if( (fp = fopen(filename, "r")) == NULL ) { printf(" file open error!!\n"); return -1; } /* 1行毎に読み出し */ char line[256], *ptr; int i, j, k; i=0; while (fgets(line, 256, fp) != NULL) { printf("*%s", line); ptr = line; j=0; do{ /* line[j]から次のタブ文字までを数値に変換 */ csv[i][j] = atof(ptr); /* 次のタブ文字の位置を探す */ ptr = strchr(ptr, SEP_DATA); /* タブ文字の次の文字を示す */ if (ptr!=NULL) { ptr++; } j++; }while(ptr!=NULL && j<M); i++; } /* ファイルクローズ */ fclose(fp); return 0; } int main(int argv, char *argc[]) { char filename[256]; if( argv > 1){ strcpy(filename, argc[1]); } else { printf("Please Input Filename:"); scanf("%s", filename); } /* データ保存用の領域を確保 */ double (*csvdata)[M]; csvdata = (double(*)[M])malloc(sizeof(double[M]) * N); //malloc(sizeof(*csvdata) * N); if ( csvdata == NULL ){ return -1; } int i,j; /* 配列の初期化 */ for( i=0; i<N; i++) { for( j=0; j<M; j++) { csvdata[i][j] = 0.0; } } /* CSVデータの読み込み */ if( csv_read(filename, csvdata) < 0 ) { return -1; } /* 配列の出力 */ for( i=0; i<N; i++) { printf("%lf", csvdata[i][0]); for( j=1; j<M; j++) { printf("\t%lf", csvdata[i][j]); } printf("\n"); } free(csvdata); csvdata = NULL; return 0; } これをNとMがどんな値であれ読み込めるようにするにはどうすれいいでしょうか

専門家に質問してみよう