• ベストアンサー

ファイル入力

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

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

  • ベストアンサー
  • yasuch
  • ベストアンサー率41% (27/65)
回答No.1

fgets()で読み込んでstrtok()で切り出せばよいのでは? 下記のようにすれば変数dataに読み出せるので、 2次元配列にでも入れてもらえれば #include <string.h> #include <stdio.h> void main( void ) { char buff[2048]; FILE *fp; char seps[] = " ,\t\n"; char *token; float data; if((fp=fopen("data.csv", "r")) == NULL) return; while(fgets(buff, sizeof(buff), fp) != NULL) { token = strtok( buff, seps ); while( token != NULL ) { sscanf(token, "%f", &data); printf("%f\n", data); token = strtok( NULL, seps ); } } fclose(fp); }

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

関連するQ&A

  • ファイルからの入力

    たとえば, 3行2列のテキストデータ 1 2 3 4 5 6 を,ファイルから読み込むとします. 入力用オブジェクトとして ifstream fin; として, while (!fin.eof()) { fin >>x>>y; x_array[i]=x; y_array[i]=y; i++; } といった感じでファイルから入力しています. 2列程度なら問題ないと思うのですが, 入力データが,たとえば 3行100列 となった場合には,上記のソースのような書き方では,対応できないと思います. どのように,すればいいのでしょか?? ご教授,お願いいたします.

  • Cでのファイルからの入力およびファイルへの出力

    こんばんわ。質問があります。Cでのファイルの入出力についてなんですが、「fscanf」と「fprintf」を用いてあるデータファイルからデータを取り込んで処理をしてファイルに書き出すプログラムを作成したのですが、私が作成したプログラムの場合、まずfscanfでファイルをすべて読み込んでしまって、それから処理をして書き出すというプログラムなのですが、この方法ではなく、はじめに最初の1行だけを読みこんでその1行だけを処理して書き出し、次に2行目だけを読み込んで処理して書き出し、そして3行目を読み込んで処理・・・・という風に1行ごとに読み込みおよび書き込みを行っていくプログラムを作成したいのですがどのようにプログラムを組んでよいのか分かりません。アドバイスがいただけると幸いです。よろしくお願いいたします。 ちなみに私が作成したプログラムは下記のようなものです。 #include <stdio.h> #define NDATA 10000 #define NMAX 40 main() { double x[NDATA], y[NDATA], z[NDATA]; double xx[NDATA], yy[NDATA], zz[NDATA]; int i, n=0 FILE *in_file, *out_file; char in_filename[NMAX], out_filename[NMAX]; printf("Input filename: "); scanf("%s", in_filename); in_file = fopen(in_filename, "r"); while(fscanf(in_file, "%lf %lf %lf", &(x[n]), &(y[n]), &(z[n])) != EOF) n++; fclose(in_file); for(i=0; i<n; i++) xx[i] = x[i]*y[i]; yy[i] = y[i]*z[i]; zz[i] = z[i]*x[i]; printf("Output filename: "); scanf("%s", out_filename); out_file = fopen(out_filename, "w"); for(i=0; i<n; i++) fprintf(out_file, "%f %f %f\n", xx[i], yy[i], zz[i]); fclose(out_file); }

  • ファイル入力の仕方

    下記のような入力ファイル(input.txt)を配列に格納するプログラムを作成しています。 下のソースコードは行数・列数が一定の場合のものですが、実際の入力データは行数・列数とも不定です。つまり、行数・列数をプログラムで読み取らなければなりません。この場合、ソースコードをどのようにすれば良いのでしょうか? 大変お手数ですが、教えてください。よろしくお願いします。 x y1 y2 y3 y4 10.0 1.2 1.5 1.0 2.1 10.5 1.3 1.4 1.2 2.2 11.0 1.8 1.2 2.2 3.1 11.5 2.1 1.0 1.2 4.5 12.0 1.9 1.1 1.1 5.5 13.0 2.4 1.1 2.1 4.2 ・1行目をchar型配列に格納したい。 ・2行目以降はdouble型配列で1列目をX[]、2列目以降をY[][]に格納したい。 ・行数は20(2行目以降)まで、列数は10(2列目以降)まで #include <stdio.h> #include <stdlib.h> int main(){ int i,j; double X[20],Y[20][4]; char x[2],y[10][4]; FILE *fpi; if((fpi=fopen("input.txt","r"))==NULL){ fprintf(stderr,"Cannot open file.\n"); exit(1); } fscanf(fpi,"%s %s %s %s %s",x,y[0],y[1],y[2],y[3]); printf("%s %s %s %s %s\n",x,y[0],y[1],y[2],y[3]); for(i=0;i<6;i++){ fscanf(fpi,"%lf",&X[i]); printf("%4.1lf ",X[i]); for(j=0;j<4;j++){ fscanf(fpi,"%lf",&Y[i][j]); printf("%4.1lf ",Y[i][j]); } printf("\n"); } printf("\n"); return 0; }

  • ファイル入力

    下記のようにテキストファイルをオープンして、fscanf文でデータを入力していくのですが、 ファイルの数が1000個ほどありまして、 ファイル名が abc001.txt abc002.txt abc003.txt ・ ・ abc100.txt のように一部だけ変わっているだけなんです。 すべてのファイル名を何回も記述するのはめんどうなので、簡単に出来る方法がありましたら、教えて欲しいです。 if((fp = fopen("abc001.txt","r"))!=NULL) { while(fscanf(fp,"%lf,%lf\n",&index[n][0],&index[n][1])!=EOF) ・ ・ ・ ・

  • C言語でのデータの読込み

    C言語である処理の方法を教えて欲しいのです。 例えばあるファイルに、20*30(縦*横)のデータが格納されていてこれらをすべて読み込む時、 while(fscanf(fp,"%lf%lf%lf・・・\n\n\n・・・",&tmp1,&tmp2,&tmp3・・・)!=EOF){ data[i][j]=tmp; j++; } このように記述すると%lfというのを30個書かなくてはいけなくなるので困っています。 他の方法が思いつきません。 もっと簡単(きれい)に読込みのできる記述を教えてください。 宜しくお願いします。

  • C言語のプログラムを見てください

    ある100行の値がx列、y列の2列あるファイルを読み込んでそれを配列に入れ、yの最小値及びそれと同じ行にあるxの値を表示するプログラムを書きたいのですがy列の最小値を表示するプログラムを書き終えた所でコンパイルして実行してみると正しく値が表示されませんでした。それどころか実行するたびに値が変わってしまいます。どこがおかしいのかわからないため、ご指摘のほどよろしくお願いします。また、できれば同じ行にあるx列の値も表示させるプログラムを教えてください。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define N 100 int main(void) { int x[N],i; double y[N],min; FILE *fp; fp=fopen("book.dat","r"); if(fp==NULL){ puts("can't open file!"); exit(-1); } for(i=0;i<N;i++){ fscanf(fp,"%d %lf", &x[N],&y[N]); printf("x=%d\n y=%lf\n",x[N],y[N]); } min=y[0]; for(i=1;i<N;i++){ if(y[i]<min) min=y[i]; } fclose(fp); printf("最小値:%lf\n",min); return 0; }

  • ファイル入力

    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; }

  • ファイル入力のエラー

    以下のファイルを配列に読み込むプログラムを作っています。 1987 1100 12 23 2.467164 0.75153 1989 1202 12 31 2.456249 0.72896 1990 1204 9 28 2.484802 0.763903 1991 1206 11 26 2.520005 0.750182 1985 1207 9 26 2.499319 0.749116 以下の通りプログラムを組んでみました。 コンパイルしたところ、出力はされませんでした。 エラーも出ていないので、入力、出力などどこが悪いのかわかりません。 ほとんど初心者です。間違いが分かる方、よろしくお願いします。 #include<stdio.h> #define SIZE 5 main() { int a, b, c, d, i; static int year[SIZE],month[SIZE],day[SIZE],code[SIZE];   double e, f; static double latitude[SIZE],longitude[SIZE]; FILE *fp; fp=fopen("c\distance.dat","r"); while((fscanf(fp,"%d%d%d%d%lf%lf",&a,&b,&c,&d,&e,&f)) !=EOF) { year[i]=a; month[i]=b; day[i]=c; code[i]=d; latitude[i]=e; longitude[i]=f; i++; printf("%13d%8d%8d%8d%9.6lf%9.6lf\n",&a,&b,&c,&d,&e,&f); } fclose(fp); return(0); }

  • C++で特殊な書式付き入力

    書式をチェックしつつ入力を行いたい場合があります。 例えば、テキストファイル中の   x=100 という行から数値部分を読み込みたいとき、  FILE *f = fopen(filename);  int x;  fscanf(f, "x=%n", &x); としてfscanfの戻り値をチェックすれば、入力が正しいフォーマットであることを チェックしつつ読み込むことができます。 同様のことをC++のストリームクラス(istream)を使って行う手段はないのでしょうか?

  • 複雑なファイルの読み取り

    あるファイルからある文字と数字を読み取りたいのですがうまくいきません。 ファイル(例) A01 B02 C03 A02 B01 A03 B03 C05 A04 C04 というファイルを読み込ませ、2行目のようにCがなければ1つ前の行のCをBがなければ1つ前のBをつかうようにしたいのですが、どうしたらいいのかわかりません。 ちなみに初心者ですので本を見ながら下記のようなところまで作ってみました。 データを検索して数値を入力 printf("A,B,Cの順で入力してください(大文字で)--"); gets(search1); gets(search2); gets(search3); while (1){ fseek(fp,RECORDLEN * no++,SEEK_SET); if(fscanf(fp,"%s",b) == EOF) break; if(strstr(b,search1) != NULL){ find++; fscanf(fp,"%s",e); fscanf(fp,"%s",d); printf("A=%s\n",b); printf("B=%s\n",e); printf("C=%s\n",d); } } いまの状態で検索すると最後の行などではBのところにCが入ったりします。どうすればうまくいくでしょうか。どなたか回答のほうをよろしくお願いします。

本好きな友達について
このQ&Aのポイント
  • 本好きな友達との関係に違和感を感じています。
  • 友達が私の読んでいる本をバカにしてきて疲れています。
  • 友達との距離を置きたいけどうまく縁を切る方法がわかりません。
回答を見る