電子書籍の厳選無料作品が豊富!

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の列のみ)読み込んで、他の列はスキップできるようなプログラムに変えたいと思うのですがどのようにしたらよろしいですか?

ちなみにテキストファイルを出力するプログラムはありません.

A 回答 (4件)

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

といった具合で ・・・
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/14 01:36

意外と知られていないのですが, scanf 系は書式文字列で「*」を使うと「読み込むけど結果は捨てる」という処理ができます. だから


fscanf(fp, "%*d%*s%lf%*lf%*lf%*lf%*lf%*lf", &eye_x[i]);
のようにすればダミーの変数も不要. %*lf の数はあってるかなぁ.
ああ, lf か f かは実際の引数に合わせてくださいね.
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/14 01:34

#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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/14 01:32

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


調べましたか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!