- 締切済み
ファイルの読み込み(必要なデータのみ)
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の列のみ)読み込んで、他の列はスキップできるようなプログラムに変えたいと思うのですがどのようにしたらよろしいですか? ちなみにテキストファイルを出力するプログラムはありません.
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
scanf 系の書式文字列の仕様をちゃんと読めば [^ ] や [^\n] がどのような意味をもつかわかるはずですが.... 調べましたか?
- yaemon_2006
- ベストアンサー率22% (50/220)
#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; }
- Tacosan
- ベストアンサー率23% (3656/15482)
意外と知られていないのですが, scanf 系は書式文字列で「*」を使うと「読み込むけど結果は捨てる」という処理ができます. だから fscanf(fp, "%*d%*s%lf%*lf%*lf%*lf%*lf%*lf", &eye_x[i]); のようにすればダミーの変数も不要. %*lf の数はあってるかなぁ. ああ, lf か f かは実際の引数に合わせてくださいね.
お礼
回答ありがとうございます。 *を使って読み込むことで無駄な変数を使わずに非常にすっきりさせることができました。
- redfox63
- ベストアンサー率71% (1325/1856)
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] ); } といった具合で ・・・
お礼
回答ありがとうございます. fgetsを使う方法で読み込む手間を省くことができました.
お礼
回答ありがとうございます。 初心者で申し訳ありません。 [^]と[^\n]はどういった解釈をすればよろしいのですか?