• ベストアンサー

fgets, sscanf, バッファ、ストリーム について

ファイルからデータを入力するのに、fscanf の代わりに fgets と sscanf を用いようと考えています。 そこで、sscanf に与えるバッファ文字列を、ファイルストリームのように扱う方法は無いものでしょうか。 例えば以下のデータファイルに対して、以下のプログラムをうまく動作させるには、どのようにすればよいでしょうか。 どうぞ、よろしくお願いします。 (データファイル test.dat) n_data 4 1 3 8 4 (プログラム) #include <stdio.h> main() { int i, n_data, *data; char buf[100]; FILE *fp; fp = fopen ( "test.dat", "r" ); fgets(buf, 100, fp); sscanf( buf, "n_data %d\n", &n_data ); data = (int *)malloc( n_data * sizeof(int) ); for( i=0; i<n_data; i++ ){ fgets(buf, 100, fp); sscanf( buf, "%d", &(data[i]) ); } sscanf( buf, "\n" ); close( fp ); printf( "n_data %d\n", n_data ); for( i=0; i<n_data; i++ ) printf( " %d", data[i] ); printf( "\n" ); } ちなみに、2行の fgets(buf, 100, fp); をコメントアウトして、 "sscanf( buf," を "fscanf( fp," に変更するとうまく動作します。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

アプローチの仕方は色々あるだろうけど、1つの方法 ---------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ int i, n_data, *data; char buf[100], *p; FILE *fp; fp = fopen ( "test.dat", "r" ); fgets(buf, 100, fp); sscanf( buf, "n_data %d\n", &n_data ); data = (int *)malloc( n_data * sizeof(int) ); fgets(buf, 100, fp); p=strtok(buf, " \t\n"); for( i=0; i<n_data; i++ ){ sscanf( p, "%d", &(data[i]) ); p=strtok(NULL, " \t\n"); } fclose( fp ); printf( "n_data %d\n", n_data ); for( i=0; i<n_data; i++ ) printf( " %d", data[i] ); printf( "\n" ); return 0; }

febrero217
質問者

お礼

strtokの機能を理解するのに少し時間がかかりましたが、理解できました。 また、stdlib.h をインクルードすべきこと、close を fcloseにすること, main を int main にして return をつけるべきことなど、質問以外の点にも配慮していただき、たいへん勉強になりました。 BLUEPIXY様には以前も、ご回答をいただいたことがありました。その際にも BLUEPIXY様のご回答に多く学ぶものがありました。 いつも良回答をくださり感謝しております。ありがとうございました。

その他の回答 (1)

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

%n でも使う?

febrero217
質問者

お礼

Tacosan様、ご回答ありがとうございます。 これまで %n を使ったことがありませんでした。 教科書で %n の機能を確認しました。 工夫すれば、うまくできそうですね。 ありがとうございました。

関連するQ&A