fscanf()は、書式付きデータをストリームから読み込みます。
#include <stdio.h>
int fscanf(FILE *stream, const char *fmt, ...);
引数streamにはデータを読み込むストリームを指定します。これは通常はfopen()が返したFILE構造体のポインタです。
fmtには読み込むデータの書式を指定する文字列を指定します。...には読み込んだデータを保存するための変数のポインタを並べて記述します。
データは、空白、タブ、改行で区切られているものと解釈されます。
この関数は読み込みに成功したデータの数を返します。
書式は次のような文字列で指定します。
%[*] [width] [pre-type]type
各部分の詳細は以下のとおりです。
*は入力の値を引数に保存しない時に指定します。
widthには入力の文字幅(文字列にしたときの長さ)を指定します。
pre-typeには、次のtypeで指定する入力数値データ引数のデフォルトサイズを変更します。
typeには次の表に示すデータの型を指定します。
タイプ | 意味 |
---|---|
h | |
l、L | データはlongまたはワイド文字。I64のときは64ビット整数。 |
c、C | 1個の文字。 |
d | intを符号付き10進整数で入力 |
i | intを符号付き8進整数で入力 |
o | intを符号なし8進整数で入力 |
u | intを符号なし10進整数で入力 |
x、X | intを符号なし16進整数、"abcdef"を使用。Xのときは"ABCDEF"で入力。 |
e、E | floatを[-]d.dddd e [+/-]ddd形式符号付きの値で入力。 |
f | floatを[-]dddd.dddd形式の符号付きの値で入力。 |
g、G | floatをfまたはeの書式のうち指定された値および精度を表現できる短い方の書式で入力。 |
s、S | 文字列を最初のNULL文字('\0')までまたはprecisionの範囲まで入力。Sの場合はワイド文字列。 |
通常、printf()系のデフォルトの実数の型はdoubleですが、fscanf()系の実数の型はfloatです。 実数はfloat変数で受け取ってからdoubleに変換する必要があります。
たとえば、「123 hello」というデータを読み込むときのコードは次のようになります。
int n;
char s[BUFSIZ];
fscanf(fp, "%d %s", &n, s);
また、たとえば「123.45 A C」というデータを読み込むときのコードは次のようになります。
float v;
char x, y;
fscanf(fp, "%6.2f %c %c", &v, &x, &y);
次の例は、テキストデータファイルdata.txtを読み込んで読み込んだデータを出力するプログラムの例です。
データファイルの形式は次の通りです。
1204 June
2641 Jimmy
5036 Kerry
プログラムは次の通りです。
#include <stdio.h>
#ifdef _MSC_VER
#pragma warning(disable : 4996)
#endif
int main(int argc, char* argv[])
{
FILE* fp;
int no;
char name[BUFSIZ];
fp = fopen("./data.txt", "r");
if (fp == NULL) {
fprintf(stdout, "ファイルを開くことができません.\n");
return;
}
while (!feof(fp))
{
if (fscanf(fp, "%d %s", &no, name) < 2)
break;
printf("%4d %s\n", no ,name);
}
fclose(fp);
return 0;
}
scanf(const char *fmt, ...);はfscanf(stdin, const char *fmt, ...);と同じです。