ファイル操作: データの永続化
電源を切っても消えない記憶。蛇口(ストリーム)の開け閉めが鍵。
ストリーム (Stream)
データの流れ。ファイルもキーボードも画面も、全てストリームとして扱われる。
FILEポインタ
開いたファイルを管理するためのハンドル。
バッファ
データを一時的に貯めておく場所。書き込みはすぐには行われず、バッファがいっぱいになったら書き込まれる(フラッシュ)。
蛇口 (Stream) のメタファー
C言語ではファイル操作を「ストリーム(流れ)」として扱います。これは蛇口のようなものです。
-
fopen: 蛇口をひねる(開く)。 -
fprintf/fgets: 水を流す(読み書き)。 -
fclose: 蛇口を閉める。 閉め忘れると水が出っ放し(リソースリーク)になり、他のアプリがファイルを開けなくなります。
読み書きの基本
書き込み (Write)
// ファイル書き込み (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> を使いましょう。
// ファイル読み込み (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を使って安全に行単位の読み込みができる