C 言語ファイル I/O 完全ガイド: ファイルの作成、オープン、読み書き、クローズ
C 言語ファイル管理の概要
C では、標準ライブラリ stdio.h がディスク上の永続データを扱うための包括的な関数群を提供します。これらのツールをマスターすれば、データの整合性とプログラムの安定性を確保しながら、ファイルを確実に作成、読み取り、書き込み、クローズできます。
主要なファイル操作関数
| 関数 | 目的 |
|---|---|
fopen() | 既存ファイルを開くか新規作成する。 |
fclose() | 開いているファイルを閉じ、リソースを解放。 |
fprintf() | フォーマット済みテキストをファイルに書き込み。 |
fscanf() | ファイルからフォーマット済みデータを読み取り。 |
getc() | ファイルから 1 文字取得。 |
putc() | ファイルに 1 文字書き込み。 |
fgets() | 1 行全体をバッファに読み込み。 |
fputs() | フォーマットなしで文字列をファイルに書き込み。 |
fseek() | ファイルポインタを指定位置に移動。 |
ftell() | 現在のファイルポインタ位置を取得。 |
rewind() | ファイルポインタを先頭にリセット。 |
ファイルモードの解説
| モード | 説明 |
|---|---|
"r" | 読み取り専用でオープン。ファイルが存在しない場合は失敗。 |
"w" | 書き込み専用でオープン。既存ファイルは切り詰め、新規作成。 |
"a" | 追記モードでオープン。書き込みはファイル末尾に追加。 |
"r+" | 読み書き両用でオープン (先頭から)。 |
"w+" | 読み書き両用でオープン。既存ファイルは切り詰め。 |
"a+" | 読み書き両用でオープン。新規データは末尾に追加。 |
ファイルの作成
ファイルを作成またはオープンするには、まずファイルポインタを宣言し、目的のファイル名とモードで fopen() を呼び出します:
FILE *fp;
fp = fopen("data.txt", "w");
ファイルが存在しない場合、fopen() が作成します。既に存在する場合、モードに応じて内容が保持または上書きされます。
絶対パス指定も可能:
fp = fopen("D:/data.txt", "w");
ファイル作成ステップのイラスト:


ファイルのクローズ
すべてのファイル操作が完了したら、必ず fclose() を呼び出してファイルディスクリプタを解放し、バッファをフラッシュします:
fp = fopen("data.txt", "r");
...
fclose(fp);
関数は成功時に 0、エラー時に EOF を返します。プログラム終了時に OS が自動的にファイルをクローズしますが、明示的なクローズがベストプラクティスとされます。
ファイルへの書き込み
書き込み時は、必要に応じて改行文字 (\n) を明示的に追加してください。主な書き込み関数:
fputc(char, FILE*)– 1 文字書き込み。fputs(const char*, FILE*)– ヌル終端文字列を書き込み。fprintf(FILE*, const char*, …)– フォーマット済み出力を書き込み。
例: fputc()
#include <stdio.h>
int main() {
int i;
FILE *fptr;
const char *str = "Guru99 Rocks\n";
fptr = fopen("fputc_test.txt", "w");
for (i = 0; str[i] != '\n'; i++) {
fputc(str[i], fptr);
}
fclose(fptr);
return 0;
}
出力ファイル fputc_test.txt の内容:

例: fputs()
#include <stdio.h>
int main() {
FILE *fp = fopen("fputs_test.txt", "w+");
fputs("This is Guru99 Tutorial on fputs,", fp);
fputs("We don't need to use for loop\n", fp);
fputs("Easier than fputc function\n", fp);
fclose(fp);
return 0;
}
結果ファイル fputs_test.txt:

例: fprintf()
#include <stdio.h>
int main() {
FILE *fptr = fopen("fprintf_test.txt", "w");
fprintf(fptr, "Learning C with Guru99\n");
fclose(fptr);
return 0;
}
結果ファイル fprintf_test.txt:

ファイルからの読み取り
データ読み取りの主要関数は 3 つ:
fgetc(FILE*)– 次の文字を返す。fgets(char*, int, FILE*)– 最大n-1文字をバッファに読み込み。fscanf(FILE*, const char*, …)– フォーマット入力をパース。
以下は fprintf_test.txt を 3 つの方法すべてで読み取る完全なデモ:
#include <stdio.h>
int main() {
FILE *fp;
char buffer[50], c;
fp = fopen("fprintf_test.txt", "r");
printf("----read a line----\n");
fgets(buffer, 50, fp);
printf("%s\n", buffer);
fclose(fp);
fp = fopen("fprintf_test.txt", "r");
printf("----read and parse data----\n");
char str1[10], str2[2], str3[20], str4[2];
fscanf(fp, "%s %s %s %s", str1, str2, str3, str4);
printf("Read String1 |%s|\n", str1);
printf("Read String2 |%s|\n", str2);
printf("Read String3 |%s|\n", str3);
printf("Read String4 |%s|\n", str4);
fclose(fp);
fp = fopen("fprintf_test.txt", "r");
printf("----read the entire file----\n");
while ((c = fgetc(fp)) != EOF) {
putchar(c);
}
fclose(fp);
return 0;
}
プログラム出力:
----read a line---- Learning C with Guru99 ----read and parse data---- Read String1 |Learning| Read String2 |C| Read String3 |with| Read String4 |Guru99| ----read the entire file---- Learning C with Guru99

getc と putc による文字単位インタラクティブ I/O
この最小例は、ユーザー入力を読み取り、ファイルに書き込み、再度読み戻す流れを示します:
#include <stdio.h>
int main() {
FILE *fp;
int c;
printf("File Handling\n");
fp = fopen("demo.txt", "w");
while ((c = getchar()) != EOF) {
putc(c, fp);
}
fclose(fp);
printf("Data Entered:\n");
fp = fopen("demo.txt", "r");
while ((c = fgetc(fp)) != EOF) {
putchar(c);
}
fclose(fp);
return 0;
}
実行例:


ポイント
- ファイルはディスク上の永続ストレージスペース。
- C 標準ライブラリは
fopen、fclose、fprintf、fscanfなどで信頼性の高いファイル操作を提供。 - 正しいモードでファイルを開き、読み取り/書き込み/追記の振る舞いを制御。
- 明示的にファイルをクローズしてバッファをフラッシュし、システムリソースを解放。
- シンプルな文字ストリームには
fgetc/putc、行ベース/フォーマット入力にはfgets/fscanfを使用。 - 書き込み時、改行を意図する場合は
\nで文字列を終端することを忘れずに。 - 堅牢なアプリケーションには適切なエラーハンドリング (
NULLポインタチェック、戻り値チェック) が不可欠。
C言語
- I/Oカードとは? 仕組みと重要性を解説
- Raspberry Pi I/Oブレイクアウトケーブルとプラグボードアダプターの自作:ステップバイステップガイド
- Apacer、グローバル展開CV110-SD & CV110-MSD高性能フラッシュカードを発表
- Apacer、産業用SV250 SSD発表:読取560MB/s、書込520MB/s
- acceed、統合I/Oモジュール「EDAM-4200シリーズ」を発表-スケーラブルで信頼性の高いデータ通信
- C# 変数とプリミティブデータ型:完全マスターガイド
- C言語入出力(I/O)マスター:scanf()とprintf()徹底解説
- C言語 ファイル入出力: fopen, fprintf, fread, fseek をマスターする
- C言語ファイルI/O完全ガイド:作成、オープン、管理の実践
- C言語ヘッダーファイルの理解:種類、使い方、ベストプラクティス
- PythonファイルI/O:ファイル操作、読み書き、管理のマスター