広告スペース

第27回 ファイル入出力

C言語のファイル操作。fopen, fprintf, fscanf, fcloseの使い方を解説。

ファイル操作の流れ

プログラムの実行結果は通常、終了すると消えてしまいます。ファイルに保存すれば、データを永続化できます。
ファイル操作は3ステップ:① 開く(fopen) → ② 読み書き(fprintf/fscanf) → ③ 閉じる(fclose)
📂
① fopen
ファイルを開く
✏️
② 読み書き
fprintf / fscanf
🔒
③ fclose
ファイルを閉じる
FILE *fp = fopen("data.txt", "w"); // "w"=書き込み
if(fp == NULL){
  printf("ファイルを開けませんでした\n");
  return 1;
}
fprintf(fp, "Hello File!\n");    // ファイルに出力
fclose(fp);                      // 必ず閉じる
⚠️ fopen の戻り値は必ず NULL チェック! ファイルが開けなかった場合(パスが間違い、権限不足)に NULL が返ります。チェックしないとプログラムがクラッシュします。

ファイルへの書き込み (fprintf)

fprintf は printf とほぼ同じですが、第1引数にファイルポインタを指定します。
FILE *fp = fopen("scores.txt", "w");

int scores[3] = {85, 92, 78};
for(int i = 0; i < 3; i++){
  fprintf(fp, "Student%d: %d\n", i+1, scores[i]);
}
fclose(fp);
モード "w" (write)
新規作成 or 上書き。既存の内容は消える。
モード "a" (append)
追記モード。既存データの末尾に追加される。
モード "r" (read)
読み取り専用。ファイルが無いと NULL が返る。

ファイルからの読み込み (fscanf)

fscanf は scanf のファイル版。戻り値で読み取り成功・失敗を判定します。
FILE *fp = fopen("numbers.txt", "r");
if(fp == NULL) return 1;

int val;
while(fscanf(fp, "%d", &val) == 1){
  printf("読み取り: %d\n", val);
}
fclose(fp);
fscanf の戻り値は「正常に読み取れた項目数」。ファイル末尾に達すると EOF を返すので、while(fscanf(...) == 1) で全データを読み切れます。

1行ずつ読む (fgets)

fgets は1行まるごと文字列として読み取ります。空白を含む行も安全に処理できるため、実務では fscanf より使われることが多いです。
FILE *fp = fopen("memo.txt", "r");
if(fp == NULL) return 1;

char buf[256];
int lineNo = 1;
while(fgets(buf, sizeof(buf), fp) != NULL){
  printf("%d: %s", lineNo, buf);
  lineNo++;
}
fclose(fp);
fgets の安全性:sizeof(buf) でバッファサイズを指定するため、バッファオーバーフローを防げます。scanf("%s") より安全な入力方法です。

自分で書いてみよう ― ファイル入出力

ファイルへの書き込みと読み込みを擬似的に体験します(ブラウザ内のシミュレーションです)。
fileio.c
出力
「実行」を押してください...
広告スペース

関連する講座

入門編
第4回 printf・scanf
C言語のprintf関数とscanf関数の使い方。書式指定子を一覧で解説。
発展編
第26回 構造体(struct)
C言語のstruct(構造体)の定義・メンバアクセス・配列との組合せを解説。
発展編
第28回 動的メモリ(malloc/free)
C言語の動的メモリ確保。malloc, free, メモリリークの原因と対策。
← 前の講座
第26回 構造体(struct)
次の講座 →
第28回 動的メモリ(malloc/free)

確認クイズ

この講座の理解度をチェックしましょう!

Q1. fopen の第2引数 "r" の意味は?

読み込み専用
書き込み専用
追記モード

"r" は read(読み込み)モードです。"w" が書き込み、"a" が追記モードです。

Q2. ファイル操作の最後に必ず行うべきことは?

free()
fclose()
return 0;

開いたファイルは必ず fclose() で閉じる必要があります。閉じないとデータが書き込まれない場合があります。

Q3. fopen が失敗したとき返される値は?

0
-1
NULL

fopen はファイルを開けなかった場合 NULL を返します。必ず戻り値を確認してエラー処理を行いましょう。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。