ファイル操作: データの永続化

電源を切っても消えない記憶。蛇口(ストリーム)の開け閉めが鍵。

ストリーム (Stream)
データの流れ。ファイルもキーボードも画面も、全てストリームとして扱われる。
FILEポインタ
開いたファイルを管理するためのハンドル。
バッファ
データを一時的に貯めておく場所。書き込みはすぐには行われず、バッファがいっぱいになったら書き込まれる(フラッシュ)。
水道の蛇口 (Water Faucet)

ファイル操作は「水道の蛇口」です。 `fopen` で蛇口をひねると、水(データ)が流れる状態(ストリーム)になります。 この水はバケツ(バッファ)に一時的に溜まり、あふれると実際にディスクに書き込まれます。 最後に `fclose` で蛇口を閉めるのを忘れないでください。閉め忘れると、水が出しっぱなしになり、他の人がその蛇口を使えなくなってしまいます(ファイルロック)。

蛇口 (Stream) のメタファー

C言語ではファイル操作を「ストリーム(流れ)」として扱います。これは蛇口のようなものです。

  • fopen: 蛇口をひねる(開く)。
  • fprintf / fgets: 水を流す(読み書き)。
  • fclose: 蛇口を閉める。 閉め忘れると水が出っ放し(リソースリーク)になり、他のアプリがファイルを開けなくなります。

読み書きの基本

書き込み (Write)

Writing to File
// ファイル書き込み (w: write mode)
FILE *fp = fopen("log.txt", "w");
if (fp == NULL) {
perror("Open failed");
return 1;
}
fprintf(fp, "Hello, File! Number: %d\n", 123);
// 蛇口を閉める (忘れるとファイルが壊れるかも)
fclose(fp);

読み込み (Read)

<code>gets</code> はバッファオーバーフローの危険があるため使用禁止です。<code>fgets</code> を使いましょう。

Reading from File
// ファイル読み込み (r: read mode)
FILE *fp = fopen("config.txt", "r");
if (fp != NULL) {
char buffer[256];
// 行単位で読み込む (安全)
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("Read: %s", buffer);
}
fclose(fp);
}

実践テクニック

パスの罠

Windowsではパス区切りに <code>\</code> を使いますが、C言語の文字列ではエスケープが必要で <code>"C:\\Data\\file.txt"</code> と大変です。多くの環境で <code>/</code> も使えるので、<code>"C:/Data/file.txt"</code> と書くのが移植性が高くおすすめです。

演習課題

課題1: メモ帳
ユーザーに入力させた文字列を "memo.txt" に保存するプログラムを作ってください。"exit" と入力されるまで追記し続けるモードに挑戦してみましょう(追記モード "a")。

合格ライン

fopenしたら必ずfcloseする癖がついている
fgetsを使って安全に行単位の読み込みができる