• 締切済み

256*256の読み込み、fscanfではどうも、、、

256*256の行列データファイルを読み込みたいのですが、 fscanf(file_i,"%lf,%lf,%lf",&d_value1,&d_value2,&d_value3); while(!feof(file_i)){ と256列分書くのは少ししんどいなぁと思いまして質問します。 なにか具体的な方法を教えていただければ幸いです。ちなみに読み込んだデータはd_data[256][256]の中に入れることができたらいいなぁと思っています。 よろしくお願いします。

みんなの回答

  • bulgaris
  • ベストアンサー率50% (8/16)
回答No.6

1つの案として fscanf( file_i, "%lf", &(d_data[i][j])); を256*256回、ループさせる。

全文を見る
すると、全ての回答が全文表示されます。
noname#11920
noname#11920
回答No.5

更にミスを...。 buf[strlen(buf) - 1] = '\0'; /* 改行文字を切り捨て */ は buf[strlen(buf) - 2] = '\0'; です。 しかし、この行は無くても構いません。 (ミスばかりして恥ずかしい...)

全文を見る
すると、全ての回答が全文表示されます。
noname#11920
noname#11920
回答No.4

済みません。ドジをしました。 思いっきりバグを作っていました。 正しくは次の通りです。 #include <stdio.h> #include <stdlib.h> #include <string.h> /* M * N 行列 */ #define M 256 #define N 256 #define BUFFER_SIZE 8192 /* 1 行分のバッファサイズ */ #define TOKEN ", \t" /* データの区切り文字 */ typedef double data_type; /* 配列が double 型の場合 */ int main(void); int read_matrix(const char *file_name, data_type matrix[][N]); data_type string_to_data_type(const char *s); /* 文字列を目的の型に変換 */ int main(void) { data_type matrix[M][N]; read_matrix("data_file.txt", matrix); } int read_matrix(const char *file_name, data_type matrix[][N]) { int i, j; static char buf[BUFFER_SIZE]; char *p, *q; FILE *fp; if ((fp = fopen(file_name, "r")) == NULL) { /* ファイルのオープンに失敗した時は 0 を返す。 */ return 0; } for (i = 0; i < M; ++i) { if (fgets(buf, sizeof(buf), fp) == NULL) { /* 読み込みエラー */ fclose(fp); return 0; } buf[strlen(buf) - 1] = '\0'; /* 改行文字を切り捨て */ p = buf; for (j = 0; j < N; j++) { q = strtok(p, TOKEN); if (q == NULL) { /* データが不正 */ fclose(fp); return 0; } matrix[i][j] = string_to_data_type(q); p = NULL; } } fclose(fp); return 1; } data_type string_to_data_type(const char *s) { return(atof(s)); } C では出来るだけ多次元配列を使わないようにしていたので、初歩的なミスをしてしまいました。 申し訳ありません。

全文を見る
すると、全ての回答が全文表示されます。
noname#11920
noname#11920
回答No.3

ちょっと煩雑なコードですが、一応一般化してあるので、 流用が効くと思います。 コンパイルが通ることは確認しましたが、 正しく動くかは不明です(多分大丈夫でしょう)。 #include <stdio.h> #include <stdlib.h> #include <string.h> /* M * N 行列 */ #define M 256 #define N 256 #define BUFFER_SIZE 8192 /* 1 行分のバッファサイズ */ #define TOKEN ", \t" /* データの区切り文字 */ typedef double data_type; /* 配列が double 型の場合 */ int main(void); int read_matrix(const char *file_name, void **matrix); data_type string_to_data_type(const char *s); /* 文字列を目的の型に変換 */ int main(void) { data_type matrix[M][N]; read_matrix("data_file.txt", (void **)&matrix); } int read_matrix(const char *file_name, void **matrix) { data_type **data = *matrix; int i, j; static char buf[BUFFER_SIZE]; char *p, *q; FILE *fp; if ((fp = fopen(file_name, "r")) == NULL) { /* ファイルのオープンに失敗した時は 0 を返す。 */ return 0; } for (i = 0; i < M; ++i) { if (fgets(buf, sizeof(buf), fp) == NULL) { /* 読み込みエラー */ fclose(fp); return 0; } buf[strlen(buf) - 1] = '\0'; /* 改行文字を切り捨て */ p = buf; for (j = 0; j < N; j++) { q = strtok(p, TOKEN); if (q == NULL) { /* データが不正 */ fclose(fp); return 0; } data[i][j] = string_to_data_type(q); p = NULL; } } fclose(fp); return 1; } data_type string_to_data_type(const char *s) { return(atof(s)); }

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

こんな感じでどうでしょうか。コンパイルチェックはしてないのですが、ま、考え方だけでもどうぞ。 char line[8192]; double d_data[256][256]; for (size_t x=0;fgets(line,8192,file_i)!= NULL;x++) { char* reading = line; for (size_t i=0; i< 256; i++) { fscanf(reading,"%lf,",&d_value[x][i]); while (*reading > '0' && *reading < '9') { reading++; } if (*reading == ',') { reading++; } } }

全文を見る
すると、全ての回答が全文表示されます。
  • goo-tara
  • ベストアンサー率24% (10/41)
回答No.1

挙げられている例では、データファイルの中身が適切であるかを確認していませんね。 freadを使って、1文字づつ読み込んだ文字の妥当性や、行あたりのデータ数などを確認しながら、配列変数に代入していくべきだと考えます。 問題を見つけたときは、データファイルの何行目、何文字目に、どのような不適合があったか記録を残して、処理を中断しましょう。 以下、参考URLより抜粋 『scanf()で読み込み不一致が起こる問題では、上記 「atoi()、atol()、atof()」を使って回避します。 読み込み不一致は、scanf()を for や while などのループの中で用いた場合、入力バッファに残されたデータを永遠に受け付けないため無限ループになってしまい意外に深刻な問題となります。 そのためデータを一旦、scanf("%s", ○)や gets()を用いて文字列として入力し、それから上記の変換関数を用いて期待するデータ型に変換するのです。』 今回の場合、標準入力でなくファイル読み込みであるため、もう少し工夫が必要ですね。

参考URL:
http://www9.plala.or.jp/sgwr-t/c/sec07.html#s7-4
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • fscanfについて

    教えてgooを参考にしましたが、fscanfを使ってテキストファイルの任意の行のデータを読み込みたいのですがうまくいきません。 テキストファイルは 0 1 1 0 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 1 1 といった感じの2進数で3行以上あります。 下に自分が作ったソースがあります。 どこがいけないのか、どういった手法があるのかを詳しく教えていただけたら幸いです。よろしくお願いします。 int gene[10]; FILE* f=fopen("Gene.txt","r"); while(fscanf(f,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", &gene[0],&gene[1],&gene[2],&gene3],&gene     [4],&gene[5],&gene[6],&gene[7],&gene       [8],&gene[9])!=EOF) n++; fclose(f);

  • fscanfの使い方。

    while(fscanf(fpi,"%[^ ]",s[i]) != EOF){//スペース毎にファイルを配列に読み込む。 while文内に入り込めないんで多分間違ってます。 sはchar型で宣言しています。 fpiは読み込み形式です。 何が間違っているかわかりません。 よろしくおねがいします。

  • fscanf()

    fcanf()がうまくいきません。 画面には、42640888のような数値が表示されます。 どこが間違ってるか教えてください。 (test.txtに23と書いてあるとします。) #include<stdio.h> int main(void) {    FILE *fp;    FILE *fp1;    char str[10];    int a;    fp=fopen("test.txt","r")    fp1=fopen("a.txt","w")    while(!feof(fp)){       fgets(str,8,fp);       fputs(str,fp1);    }    fscanf(fp,"%d",&a);    printf("%d",a);   fclose(fp);   fclose(fp1);   return 0; }

  • C言語で複数列のデータを1列のみ読み込みたい

    行m列の任意のデータの処理を行うプログラムで, 列ごとの統計を行うためにm列目のデータを取り出したいのですが,うまくいきません. どのようなコードを書けばいいでしょうか? 自分で作ってみたのは以下のようなプログラムです(ファイルを開いて→m列目の読み込みの部分) EOFを使っているためか,行数のiには全データ数が入ってしまいます. void main (void) { FILE* fp; int i, j; i=0, j=0; char FilePath[500]; char Folder[100]; char File[50]; printf("Folder Name:"); scanf("%s",&Folder); printf("File Name:"); scanf("%s",&File); sprintf(FilePath,"%s/%s",Folder,File); if(( fp = fopen (FilePath,"r")) == NULL){ printf("cannot open '%s'\n", FilePath); exit(1); } //ここまではうまく動きます while (fscanf(fp, "%lf", &A[i][0]) != EOF{ i++; } while (fscanf(fp, "%lf", &A[0][j]) != EOF){ j++; } printf("A[%d][%d]", i, j); int n, m;              //n,mはこの後for文で使いたいので登場してもらいました printf("input 'n':"); scanf("%d", &n); printf("input 'm':"); scanf("%d", &m); }

  • C言語のバイナリモードでのfscanf関数の使い方について教えて下さい

    C言語のバイナリモードでのfscanf関数の使い方について教えて下さい。 2*2のint型配列バイナリデータを読み込んで、要素一つ一つを出力したいのですが、 fscanfでの書式指定の仕方がよく分かりません。 fscanf(入力元,"???",&入力先)の???の部分はどう指定すればよいのでしょうか? 下記のようなプログラムを書いたのですが、fscanfでデータを読み込めず、 data=0という出力で無限ループに入ってしまいます。 C言語初心者なので、かなり初歩的な質問かと思いますが、 よろしくお願いします。 -------------------------------------- char *fi; int data; fi = argv[1]; /* 2x2のint型配列バイナリデータを指定 */ input = fopen(fi,"rb"); while(!feof(input)){ fscanf(input,"%d",&data); printf("data=%d\n",data); } ---------------------------------------

  • ファイル入力

    Cで,ファイル入力の質問です。 たくさんの行があっても,2列程度の値の並んでいるファイルから入力するのは, 23 45 34 99 ・・・・・ while (EOF != fscanf(in,"%lf %lf",&x,&y)) のようにすればいいと思うのですが, もし,100行100列のようなデータ列のファイルから,入力をするにはどうしたらいいのでしょうか??

  • 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 ***************************************************************************************************

  • 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です。 よろしくおねがい致します。

  • C言語のプログラムに関する質問です。

    C言語初心者で困っています。 SNをサンプリング数、FNをファイル数として、テキストファイルの1行目のデータ(kari[0])と2行目のデータ(kari[1])をそれぞれCH1、CH2に読み込むような以下のようなプログラムがあります。 ------------------------------------------ //読込みファイル名の設定// for(j=1;j<FN+1;j++){ sprintf(file_name,"%s%d%s",file,j,".txt"); printf("%d%s\n",j,file_name); if ((fp = fopen(file_name, "r")) == NULL){ printf("Error: Can't open file; %s\n", file_name); } //データの読込み// for(i=0;i<SN;i++){ fscanf(fp,"%lf,%lf\n",&kari[0],&kari[1]); ch1[i]=kari[0]; ch2[i]=kari[1]; } fclose(fp);       ・       ・       ・ fclose(fp); } ---------------------------------------------- しかし、テキストファイルの初めの3行には不必要な文字列が存在するため、4行目から読み込むように設定したいのですが、やり方がよく分かりません。 どのようにプログラムを書き換えれば良いか、教えていただけると助かります。 よろしくお願いします。

  • C言語初心者の質問 fscanf

    C言語を勉強し始めた初心者です。 後述するプログラムにおいて、カレントディレクトリ上にあるフォルダー(data)内のファイル名をfscanfで読み込んで、標準出力で表示するプログラムを作っています。 コンパイルはうまくいくのですが、プログラムを実行しようとするとプログラムが停止してうまくいきません。 不具合点と改善点をおしえてください。 実行環境?はwindows7,visual studio 2013 です。 #include<stdio.h> int main(void) { int i=0; char s[100][100]; FILE *fp; fp=fopen(".\\data","r"); while((fscanf(fp,"%s",&s[i][100]))!=EOF){ printf("%d:%s\n",i,s[i][100]); i++; } return 0; }