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 とつなげていくと、
ファイル入出力の理解が一気に深まります 👍