C言語のファイル入出力関数fscanf()とfprintf()の注意点

2010年2月14日

ファイルに配列のデータ内容を書き込んで、それを再度プログラム実行する際などに そのままバイナリのように読み込んで利用することがよくあると思います。そんなとき、 型を指定してファイル書き込み・読み込みできるfscanf(), fprintf()は非常に有用です。

でも、fscanf()fprintf()はバイナリ書き込みするのではなく、テキストを書き込むもの なので注意が必要です。例えば、

1
2
3
4
FILE* fp;
wfp = fopen("hoge.txt", "wb");
fprintf(wfp, "%d", 2008);
fprintf(wfp, "%d", 2009);

としても、2008が整数型、すなわち4バイトで書き込まれる訳ではありません。 整数型をテキスト文字列"20082009"として書き込む訳です。従って、 以下のようにfscanf()を使って、2008、2009が別々に読み込まれる訳ではないのです。

1
2
3
4
5
int int1, int2;
FILE* fp;
ifp = fopen("hoge.txt", "rb");
fscanf(ifp, "%d", &int1);
fscanf(ifp, "%d", &int2);

この場合、1回目のfscanf()で、20082009という文字列がint1に整数変換されて代入されてしまいます。 なので、以下のようにすることで、正常に読み書きできるようになります。

1
2
3
4
5
6
7
8
9
FILE* fp;
wfp = fopen("hoge.txt", "wb");
fprintf(wfp, "%d ", 2008);
fprintf(wfp, "%d ", 2009);
int int1, int2;
FILE* fp;
ifp = fopen("hoge.txt", "rb");
fscanf(ifp, "%d ", &int1);
fscanf(ifp, "%d ", &int2);

よく見ると分かるように、fprintf(), fscanf()ともに、%dのあとにスペース文字がありますね。 このように、文字列フォーマットを指定してあげることで、fprintf(), fscanf()でも読み書きが 簡単にできるようになりますよ。