• 締切済み

ファイルの読み込み(必要なデータのみ)

C言語でテキストファイルからデータの読み込みを行っています. 既成のシステムであるステレオカメラからフレーム毎のデータが以下のようにテキストファイルに出力されます(実際はもっとたくさんの種類のデータを含みます). frame_number blinking eye_x eye_y eye_z head_x head_y head_z 1 no 0.3 0.2 0.8 1.2 0.8 0.5 2 no 0.2 0.4 0.5 1.3 0.8 0.4 3 no 0.3 0.5 0.7 1.4 0.7 0.6 4 no 0.4 0.4 0.9 1.3 0.8 0.4 5 yes 0.5 0.4 0.2 1.2 0.9 0.3 6 no 0.7 0.3 0.2 1.1 0.5 0.4 7 no 0.8 0.6 0.4 1.5 0.6 0.6 ・    ・  ・  ・  ・   ・   ・   ・ ・    ・  ・  ・  ・   ・   ・   ・ ・    ・  ・  ・  ・   ・   ・   ・ ・    ・  ・  ・  ・   ・   ・   ・ 100 no 0.7 0.3 0.2 1.1 0.5 0.4 そこでファイル読み込みの際に現在では、すべてのデータにblinking[100],eye_x[100],...,head_z[100],...のような配列を作り、各データ毎に読み込んでいます. for (i=0;i;100;i++) {  ・・・・・・・・・・・・・・  fscanf( fp, "%s", &blinking[i]);  fscanf( fp, "%f", &eye_x[i]);  ・・・・・・・・・・・・・・  fscanf( fp, "%f", &head_x[i]);  ・・・・・・・・・・・・・・ } しかし、実際に使用したいデータがeye_xのみの場合、すべて読み込んでいては非効率的ではないと考えています。そこで必要なデータのみ(例えばeye_xの列のみ)読み込んで、他の列はスキップできるようなプログラムに変えたいと思うのですがどのようにしたらよろしいですか? ちなみにテキストファイルを出力するプログラムはありません.

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

scanf 系の書式文字列の仕様をちゃんと読めば [^ ] や [^\n] がどのような意味をもつかわかるはずですが.... 調べましたか?

回答No.3

#include <stdio.h> int main(void) { FILE *fp = fopen("data.txt", "r"); double ex; if(!fp) return 1; while(fscanf(fp, "%*d %*[^ ] %lf %*[^\n]%*c", &ex) != EOF) printf("%f\n" ,ex); fclose(fp); return 0; }

katsu77
質問者

お礼

回答ありがとうございます。 初心者で申し訳ありません。 [^]と[^\n]はどういった解釈をすればよろしいのですか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

意外と知られていないのですが, scanf 系は書式文字列で「*」を使うと「読み込むけど結果は捨てる」という処理ができます. だから fscanf(fp, "%*d%*s%lf%*lf%*lf%*lf%*lf%*lf", &eye_x[i]); のようにすればダミーの変数も不要. %*lf の数はあってるかなぁ. ああ, lf か f かは実際の引数に合わせてくださいね.

katsu77
質問者

お礼

回答ありがとうございます。 *を使って読み込むことで無駄な変数を使わずに非常にすっきりさせることができました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

fgetsなどで1行読み込んで sscanfでダミーと必要な変数でいい思います char lbuf[256], dummy_dtr[64]; int dummy_int; for ( i = 0; i < 100; i++ ) {   fgets( lbuf, sizeof( lbuf ), fp );   sscanf( lbuf, "%d %s %f", &dummy_int, dummy_str, &eye_x[i] ); } といった具合で ・・・

katsu77
質問者

お礼

回答ありがとうございます. fgetsを使う方法で読み込む手間を省くことができました.

関連するQ&A

  • データの読み込みがうまくいかなくて、困っています

    プログラミング初心者です。 誤差逆伝播学習のプログラムを行っています。 C言語で、データの読み込み部分がうまくいかなくて、困っています。 borland , BCC Developerなどを用いてやっております。 やりたいことは、テキストファイルから数字を読み込み、それを行列に格納してデータとして送るということです。 その際に、テキストファイルで行と列で表示されたものを送ろうと考えています。30×30の、1と0で表示された絵と教師信号を読み取っています。 列だけの読み込みは正常に動いたのですが、行と列で表示されたものの読み込みができません。char型で変数を宣言しているので、数字として読み込めていないとか、そういったことがあるのでしょうか。o1[][],t[][]の部分に正しく値が送れるようにしたいです。 非常にわかりにくくて申し訳ないのですが、お分かりになる方がいたら、どこをどう変えれば良いか、教えて頂きたいです。 「間違っている列と行の読み込み」 //データをファイルから読み込む// void read_file(name) char *name; { int i,j,k; //ループカウンター// FILE *fp; //ファイルポインタ// char buff[MCHS]; //buffの最大文字数1024 //ファイルオープン// if((fp=fopen(name,"r"))==NULL){ fprintf(stderr,"%s:File open error !!\n",name); exit(-1); } //学習データを読み込む// fscanf(fp, "%d",&learning_pattern_no); //学習パターンの数読み込み fscanf(fp,"%d",&test_pattern_no); //テストパターンの数読み込み printf("学習パターンの数:%d\n",learning_pattern_no); //学習パターンの数表示 printf("テストパターンの数:%d\n",test_pattern_no); //テストパターンの数表示 i=0;j=0; while( fgets( buff, MCHS, fp ) != NULL ){ if(j<=learning_pattern_no+test_pattern_no-1){ for( k=0; k<MCHS; k++ ){ o1[j][i+k]=buff[k]; //o1[j][i+k]にbuff[k]を入れる printf("%c",buff[k]); //printfで確認 if( buff[k] =='\n'){ i=i+k; if (i==InputUnitNo){ i=0; j++; printf("%d",j); }//if(i==InputUnitNo)終了 break; }//if(buff[k])終了 }//for終了 }//if(j<=learn+test)終了 else{ //ここから教師信号の読み取り for( k=0; k<MCHS; k++ ){ t[i][k]=buff[k]; printf("%c",buff[k]); //教師信号の確認 if( buff[k] == '\n' ){ i++; break; }//if(buff[k])終了 }//for終了 }//else終了 }//while終了 } 「正常に動いた列だけの読み込み」 //データをファイルから読み込む// void read_file(name) char *name; { int i,j; //ループカウンター// FILE *fp; //ファイルポインタ// //ファイルオープン// if((fp=fopen(name,"r"))==NULL){ fprintf(stderr,"%s:File open error !!\n",name); exit(-1); } //学習データを読み込む// fscanf(fp, "%d",&learning_pattern_no); printf("学習データの数:%d\n",learning_pattern_no); for(i=0;i<learning_pattern_no; i++){ for(j=0;j<InputUnitNo; j++) fscanf(fp,"%lf",&o1[i][j]); for(j=0;j<OutputUnitNo; j++) fscanf(fp,"%lf",&t[i][j]); //教師信号 } //テストデータを読み込む// fscanf(fp,"%d",&test_pattern_no); printf("テストデータの数:%d\n",test_pattern_no); for(i=learning_pattern_no;i<learning_pattern_no+test_pattern_no;i++) for(j=0;j<InputUnitNo;j++) fscanf(fp,"%lf",&o1[i][j]); fclose(fp); }

  • ファイルの作成・書き込み・読み込みについて

    ファイルの取り扱いについて、どのように記述すればいいのかが分かりません。 分からないことが多いので(1)~(4)の質問に分けています、Cの勉強は趣味程度にしかできていないので、詳しくご回答いただけると嬉しいです。 自分なりに書いてみます、間違いがあればご指摘宜しくお願いします。 (1)Aを頭文字にして100個のcsvファイルを作成 (a1,a2…a100) char A[100] FILE *fp; for(i=1;i<101;i++) { snprintf(A,sizeof A,"A%d.csv",i); if((fp = fopen(A,"w"))!=NULL) {exit(1);} } (2)A1を開きデータを入れる、この動作を同様に2~100で繰り返す。 A1に入れたいデータはx,y,zで1000行 fp = fopen("A1.csv","a"); for(z=1;z<11;z++) { for(y=1;y<11;y++) { for(x=1;x<11;x++) { fprintf(fp,"%d,%d,%d\n",x,y,z); } } } fclose(fp); これでこんな感じに書き込まれるはず・・・ 1,1,1 2,1,1 3,1,1  ・  ・  ・ 10,10,10 これを同様に2~100のファイルに対して一気に行いたいですが、書き方が分かりません。 (3)再びA1を開きx=10,Y=10の時のzの値を知りたい。 こんな事はできるのでしょうか? もし無理なら~行目のデータを呼び出す (4)そしてA1を開きx=10,Y=10の時の、zだけを上書き。 長くなってすいません、分からない事だらけなので宜しくお願いします。

  • ファイルへのデータ書き出しが出来なくて困っています。

    openCVを利用し、用意した画像1、画像2間のオプティカルフローを計算し、画像3に描画するというプログラムを組みました。 その過程での、オプティカルフローのx成分「vel_x」、y成分「vel_y」の値をテキストファイルに書き出したいのですが、それぞれ「003B3340」「003B33E0」と記録されるだけで(多分アドレス?)うまくいきません。 どなたか詳しい方、ご教授いただけると幸いです。 環境はWindows XP、Visual C++ .NET2003です。 以下にコードを示します。 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <fstream> const char *imgA_file = "01.bmp"; const char *imgB_file = "02.bmp"; using namespace std; int main(int argc, char** argv){ IplImage *imgA_src = cvLoadImage( imgA_file, -1); //画像読み込み IplImage *imgB_src = cvLoadImage( imgB_file, -1); IplImage *imgA = cvCreateImage(cvGetSize(imgA_src), IPL_DEPTH_8U, 1); cvCvtColor(imgA_src, imgA, CV_BGR2GRAY); IplImage *imgB = cvCreateImage(cvGetSize(imgA_src), IPL_DEPTH_8U, 1); cvCvtColor(imgB_src, imgB, CV_BGR2GRAY); IplImage *vel_x = cvCreateImage(cvGetSize(imgA_src), IPL_DEPTH_32F, 1); //x,y方向の速度を記録するバッファを確保する IplImage *vel_y = cvCreateImage(cvGetSize(imgA_src), IPL_DEPTH_32F, 1); IplImage *imgC = cvCloneImage(imgA); //結果画像用に入力画像をコピーする cvCalcOpticalFlowLK( imgA, imgB, cvSize( 11, 11), vel_x, vel_y); //オプティカルフローを求める,第3引数:ウインドウサイズ ofstream ofx("vel_x.txt"); //vel_x, vel_y のデータをテキストへ書き込み string buf; ofx << vel_x << endl; ofstream ofy("vel_y.txt"); buf; ofy << vel_y << endl; /* FILE *fp1, *fp2; //vel_x, vel_y のデータをテキストへ書き込み fp1 = fopen("vel_x.txt", "w"); fp2 = fopen("vel_y.txt", "w"); fprintf(fp1, "%d", vel_x); fprintf(fp2, "%d", vel_y); fclose(fp1); fclose(fp2); const CvArr *m, *n; // FILE *fp1, *fp2; fp1 = fopen("vel_x.txt", "r"); fp2 = fopen("vel_y.txt", "r"); fscanf(fp1, "%d", &m); fscanf(fp2, "%d", &n); fclose(fp1); fclose(fp2); */ for ( int i=0;i<imgA->height;i+=10 ){ //結果画像の作成 for ( int j=0;j<imgA->width;j+=10 ){ int dx = (int)cvGetReal2D( vel_x, i, j); int dy = (int)cvGetReal2D( vel_y, i, j); cvLine( imgC, cvPoint( j, i), cvPoint( j+dx, i+dy), CV_RGB( 255, 255, 255), 1, 8, 0); cvRectangle( imgC, cvPoint( j+dx-1, i+dy-1), cvPoint( j+dx+1, i+dy+1), CV_RGB( 255, 255, 255), 1, 8, 0); } } cvSaveImage( "03.bmp", imgC); //画像保存 cvReleaseImage( &imgA); cvReleaseImage( &imgB); cvReleaseImage( &vel_x); cvReleaseImage( &vel_y); return 0; }

  • C言語 所々の意味を教えてください><;

    #include <stdio.h> #define N 100 int main(void) { double xn[N], yn[N], x, y; int i, cnt; FILE *fp; if((fp=fopen("data.txt", "r"))==NULL) return 0; for(i=0; fscanf(fp, "%lf%lf", xn + i, yn + i)==2; i++); cnt = i; scanf("%lf", &x); if(x < xn[0] || xn[cnt-1] <= x) return 0; for(i=0; xn[i] < x; i++); y = (yn[i+1] - yn[i]) * (x - xn[i]) / (xn[i+1] - xn[i]) + yn[i]; printf("y = %f\n", y); return 0; } この文の FILE *fp; if((fp=fopen("data.txt", "r"))==NULL) return 0; for(i=0; fscanf(fp, "%lf%lf", xn + i, yn + i)==2; i++); cnt = i; ここの部分でデータテキストを読み込んでるのはわかるんですが fscanf(fp, "%lf%lf", xn + i, yn + i)部分で何をやってるかわかりません。誰か教えてください

  • ファイルの入出力

    学生です。まだ習い始めて間もないのですがよろしくお願いします。 27.000000,207.000000,116.000000 48.000000,90.000000,116.000000 48.000000,90.000000,116.000000       : テキストの中にある上記のカンマ区切りのデータをfscanfで読み込んで違うテキストに同じ数値を出力したいのですがうまく出力できません。 0.000000,0.000000,+NAN 0.000000,0.000000,+NAN 0.000000,0.000000,+NAN      : 数値は上記のように出力されてしまいます。 プログラムは以下の通りです。 main() { FILE *fp; double m[30][3]; int i,j; double e1,e2,e3; fp=fopen("data00.txt","r"); for(i=0;i<30;i++){  fscanf(fp,"%f,%f,%f\n",&e1,&e2,&e3);  m[i][0]=e1;  m[i][1]=e2;  m[i][2]=e3; } fclose(fp); fp=fopen("data01.txt","w"); for(j=0;j<30;j++){  fprintf(fp,"%f,%f,%f\n",m[j][0],m[j][1],m[j][2]); } fclose(fp); getch(); exit(0); } データの読み込みがうまくいってないのだと思いますがわかりません。 間違いがあったならご指摘お願いします。

  • C言語 ファイル処理

    今、c言語のファイル処理の勉強をしているのですが。 あるファイルfp1に 106 106 106 102 177 183 123 125 105 102 101 111 というデータが入っていたとして、 このファイルfp1からこのデータを2次元配列m[i][j]に入れたいんですけど、 一応プログラム書いてみましたがうまくいきません。 for(i=0;i<3;i++){   for(j=0;j<4;j++){     fscanf(fp1,"%d",&x); /*データ読み込み*/  m[i][j]=x;     }   } for(i=0;i<3;i++){   for(j=0;j<4;j++){     printf("%d ",m[i][i]);   }   putchar('\n'); } 変数宣言部、ファイルオープン部などは省略しました。 このプログラムを実行すると。 106 106 106 106 106 106 106 106 106 106 106 106 102 102 102 102 177 177 177 177 183 183 183 183 123 123 123 123 125 125 125 125 105 105 105 105 102 102 102 102 101 101 101 101 111 111 111 111 みたいな感じで表示されます。何ででしょうか? アドバイスお願いします。

  • c言語の初心者なんですけど、ファイルからの読み込みで、文字や,や数字を

    c言語の初心者なんですけど、ファイルからの読み込みで、文字や,や数字を読み込みたいんですけど できません。 おしえてください。 プログラムは・・・・ #include<stdio.h> #include<ctype.h> int main(void){ char x[500][4]; FILE *fp; int i,j; fp=fopen("data2.txt","r"); for(i=0;i<500;i++){ for(j=0;j<4;j++){ fscanf(fp,"%c",&x[i][j]); } printf("%c,%d,%d,%d\n",x[i][0],x[i][1],x[i][2],x[i][3]); } fclose(fp); } ファイルは 田中,5,abc,18 鈴木,89,57,21 佐藤,,8,69 高橋,95,9,7

  • ファイルのデータがうまく読み込まれません

    こんにちは。ファイルからデータを読み込んで、平均値と標準偏差を求めるプログラムを書いているんですが、計算結果がなぜか違う値になってしまいます。書いているプログラムは、 #include<stdio.h> #include<math.h> #define MAX 200 /* ファイル"sample.txt"から複数の値を入力し、それらの  平均値、標準偏差を出力する.  */ void main(void) { FILE *fp; char text[256],l[256]; int i, n; float a[MAX], sum,sum2,mean,sdev; fp = fopen("sample.dat","r"); /* sample.txt を開く */ if(fp == NULL){ printf("Error!\n");exit(0);}/* sample.txtがなければ停止 */ for(i = 1; i <= 3; i++) fscanf(fp, "%s\n",text); for(i = 0; i < MAX; i++) { if(fscanf(fp, "%s %f\n",l, a[i]) == EOF ) ; } n = i; sum = a[0]; sum2 = a[0]*a[0]; for(i = 0; i < n; i++) { sum += a [i]; sum2 += a[i]*a[i]; } mean = sum/n; /* 平均値の計算 */ sdev = sqrt(sum2/n - mean*mean); /* 標準偏差の計算 */ printf(" mean : %6.2f\n", mean); printf("standard dev.: %6.2f\n",sdev); } で、読み込むファイルは 平均値と標準偏差の計算 クラスA組み 氏名 身長(cm) 鈴木 175.54 佐藤 170.34 清水 165.29 徳田 185.23 赤木 178.61 と、長くなってしまいましたが、if文の中のfscanfの部分が違うんでしょうか?初心者でどこが違うのか分かりません。教えていただけないでしょうか?

  • 構造体でのファイル操作

    1 2 3 1 2 3 1 2 3 1 2 3 みたいに書き込まれた txtデータを構造体でよみこみたいのですけどうまくいきません プログラムはこんなかんじです int i=0; FILE *fp; fp = fopen("Data.txt","r"); while (fscanf(fp, "%d,%d,%d",a.no[i],a.A[i],a.B[i] ) != EOF){ i++; } fclose(fp); a.noが1列目で a.Aが2列目で a.Bが3列目です Debug assertion failed  と表示されます どうしてでしょうか?

  • C++ファイルからデータ入力して計算、ファイル出力

    C++初心者です。 ファイルの数値データを入力して、それらを計算してからファイルに出力する方法がわかりません。 たとえば、 入力ファイル   出力ファイル 行数  x y z (1)  1 1 6   y(1)*exp(z(1)-x(1))+y(2)*exp(z(2)-x(1))+... (2)  3 5 2   y(1)*exp(z(1)-x(2))+y(2)*exp(z(2)-x(2))+... (3)  5 6 9  y(1)*exp(z(1)-x(3))+y(2)*exp(z(2)-x(3))+... (4)  9 1 3   y(1)*exp(z(1)-x(4))+y(2)*exp(z(2)-x(4))+… (5)  1 7 8   y(1)*exp(z(1)-x(5))+y(2)*exp(z(2)-x(5))+... 入力したデータを上記のように計算してから出力ファイルにしたいのですが、複雑なのでプログラムをどう組み立てれば良いのかわかりません。 ちょっとしたことでも結構です、参考になりそうなサイトや、ロジック、プログラムに関するアドバイスいただけませんか。

専門家に質問してみよう