
C言語入門|書式付きでファイルに出力する:fprintfの基本
画面に出せるなら、ファイルにも出せる
ここまでで、ファイルのオープンとクローズ、
1文字単位・文字列単位での読み書きを学んできました。
すると、こんな疑問が出てくるはずです。
printf みたいに、数値や文字列を整形して
そのままファイルに書き込めないの?
安心してください。
それを実現するのが fprintf です。

fprintf は printf の仲間
fprintf は、printf とまったく同じ書式指定が使える関数です。
違いは、出力先が画面かファイルか だけです。
出力先の違い
| 関数 | 出力先 |
|---|---|
| printf | 標準出力(画面) |
| fprintf | 指定したファイル |
イメージとしては、
- printf:画面につながるストリームへ出力
- fprintf:ファイルにつながるストリームへ出力
という関係になります。
fprintf を使った書き込み例
次のプログラムでは、
複数のデータを CSV 形式でファイルに書き込み、
書き込んだ文字数を画面に表示します。
サンプルプログラム
プロジェクト名:14-8-1 ソースファイル名: sample14-8-1.c
Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char label[16];
int score;
double rate;
} Record;
int main(void)
{
FILE* fp;
char filename[] = "result.csv";
Record rec[3] = {
{"Alpha", 85, 1.25},
{"Beta", 92, 0.80},
{"Gamma", 78, 1.00}
};
fp = fopen(filename, "w");
if (fp == NULL) {
exit(1);
}
for (int i = 0; i < 3; i++) {
int count = fprintf(fp, "%s,%d,%4.2f\n",
rec[i].label,
rec[i].score,
rec[i].rate);
if (count < 0) {
printf("書き込みに失敗しました\n");
fclose(fp);
exit(1);
} else {
printf("%d文字を書き込みました\n", count);
}
}
fclose(fp);
return 0;
}
書き込まれる内容を確認する
このプログラムを実行すると、
画面には次のように表示されます。
14文字を書き込みました
13文字を書き込みました
14文字を書き込みましたそして、result.csv には次の内容が書き込まれます。
Alpha,85,1.25
Beta,92,0.80
Gamma,78,1.00このように、
printf と同じ感覚で整形したデータをそのままファイルに保存できる
のが fprintf の大きな強みです。
fprintf の書式指定を読み解く
書き込みの中心となっているのは、次の1行です。
fprintf(fp, "%s,%d,%4.2f\n", label, score, rate);この書式指定は、次の意味を持ちます。
| 指定子 | 意味 |
|---|---|
| %s | 文字列 |
| %d | 整数 |
| %4.2f | 実数(小数点以下2桁) |
| \n | 改行 |
CSV ファイルでは、
データをカンマで区切り、行単位で保存するのが一般的なので、
fprintf は非常に相性が良い関数です。
fprintf の戻り値を活用する
fprintf は、
実際に書き込んだ文字数 を戻り値として返します。
| 戻り値 | 意味 |
|---|---|
| 0以上 | 書き込んだ文字数 |
| 負の値 | 書き込み失敗 |
これを利用すると、
- 書き込みが成功したかどうか
- どれくらいのデータを書いたか
を簡単にチェックできます。
ファイル操作では、
失敗を見逃さないためにも戻り値の確認はとても重要です。
fprintf の役割を整理する
fprintf でできること
- 数値や文字列を整形して出力できる。
- printf と同じ書式指定が使える。
- CSV やログファイルの作成に向いている。
向いている用途
| 用途 | 理由 |
|---|---|
| CSV ファイル | カンマ区切りを簡単に表現できる。 |
| セーブデータ | 数値と文字列を混在させられる。 |
| ログ出力 | 書式を統一しやすい。 |
ここまでのまとめ
この節のポイントは次のとおりです。
- fprintf は printf と同じ使い方ができる。
- 違いは出力先がファイルであること。
- 書式指定でデータを整形できる。
- 戻り値で書き込み結果を確認できる。
fprintf を使いこなせるようになると、
「見やすいデータをそのままファイルに残す」
という処理が自然に書けるようになります。
次は、
バイナリ向けの fread / fwrite とつなげていくと、
ファイル入出力の理解が一気に深まります 👍
