ファイル操作は、プログラムがデータを保存、読み込み、操作するための重要な機能です。C言語では、標準ライブラリの関数を使用してファイルを操作することができます。ここでは、ファイル操作の基本から応用まで、具体例を交えて詳しく説明します。
1. ファイルのオープンとクローズ
ファイルを操作する最初のステップは、ファイルをオープンすることです。C言語では、fopen
関数を使用してファイルをオープンし、fclose
関数を使用してファイルをクローズします。
1.1 ファイルのオープン
#include <stdio.h> int main() { FILE *file; file = fopen("example.txt", "r"); // ファイルを読み取りモードでオープン if (file == NULL) { printf("ファイルを開くことができませんでした。\n"); return 1; } printf("ファイルを正常に開きました。\n"); fclose(file); // ファイルをクローズ return 0; }
出力:
ファイルを正常に開きました。
1.2 ファイルのクローズ
ファイル操作が終了したら、fclose
関数を使用してファイルをクローズします。これにより、ファイルが適切に保存され、リソースが解放されます。
2. ファイルへの書き込み
ファイルにデータを書き込むには、fprintf
やfputs
などの関数を使用します。
2.1 fprintf関数を使用した書き込み
#include <stdio.h> int main() { FILE *file; file = fopen("example.txt", "w"); // ファイルを書き込みモードでオープン if (file == NULL) { printf("ファイルを開くことができませんでした。\n"); return 1; } fprintf(file, "Hello, World!\n"); // ファイルに文字列を書き込む fclose(file); // ファイルをクローズ return 0; }
出力:
(example.txtに書き込まれる内容) Hello, World!
2.2 fputs関数を使用した書き込み
#include <stdio.h> int main() { FILE *file; file = fopen("example.txt", "w"); // ファイルを書き込みモードでオープン if (file == NULL) { printf("ファイルを開くことができませんでした。\n"); return 1; } fputs("Hello, World!\n", file); // ファイルに文字列を書き込む fclose(file); // ファイルをクローズ return 0; }
出力:
(example.txtに書き込まれる内容) Hello, World!
3. ファイルからの読み込み
ファイルからデータを読み込むには、fscanf
やfgets
などの関数を使用します。
3.1 fscanf関数を使用した読み込み
#include <stdio.h> int main() { FILE *file; char str[100]; file = fopen("example.txt", "r"); // ファイルを読み取りモードでオープン if (file == NULL) { printf("ファイルを開くことができませんでした。\n"); return 1; } fscanf(file, "%s", str); // ファイルから文字列を読み込む printf("読み込んだ文字列: %s\n", str); fclose(file); // ファイルをクローズ return 0; }
出力:
読み込んだ文字列: Hello,
3.2 fgets関数を使用した読み込み
#include <stdio.h> int main() { FILE *file; char str[100]; file = fopen("example.txt", "r"); // ファイルを読み取りモードでオープン if (file == NULL) { printf("ファイルを開くことができませんでした。\n"); return 1; } fgets(str, sizeof(str), file); // ファイルから文字列を読み込む printf("読み込んだ文字列: %s\n", str); fclose(file); // ファイルをクローズ return 0; }
出力:
読み込んだ文字列: Hello, World!
4. バイナリファイルの操作
バイナリファイルは、テキストファイルとは異なる形式でデータを格納します。fread
やfwrite
関数を使用してバイナリファイルを操作します。
4.1 バイナリファイルへの書き込み
#include <stdio.h> int main() { FILE *file; int num = 12345; file = fopen("example.bin", "wb"); // バイナリ書き込みモードでオープン if (file == NULL) { printf("ファイルを開くことができませんでした。\n"); return 1; } fwrite(&num, sizeof(int), 1, file); // ファイルに整数を書き込む fclose(file); // ファイルをクローズ return 0; }
4.2 バイナリファイルからの読み込み
#include <stdio.h> int main() { FILE *file; int num; file = fopen("example.bin", "rb"); // バイナリ読み取りモードでオープン if (file == NULL) { printf("ファイルを開くことができませんでした。\n"); return 1; } fread(&num, sizeof(int), 1, file); // ファイルから整数を読み込む printf("読み込んだ整数: %d\n", num); fclose(file); // ファイルをクローズ return 0; }
出力:
読み込んだ整数: 12345
5. ファイルポインタの位置を操作
ファイルポインタの位置を変更するには、fseek
やftell
関数を使用します。
fseek関数とftell関数
#include <stdio.h> int main() { FILE *file; long pos; file = fopen("example.txt", "r"); // ファイルを読み取りモードでオープン if (file == NULL) { printf("ファイルを開くことができませんでした。\n"); return 1; } fseek(file, 0, SEEK_END); // ファイルポインタをファイルの終わりに移動 pos = ftell(file); // 現在のファイルポインタの位置を取得 printf("ファイルサイズ: %ldバイト\n", pos); fclose(file); // ファイルをクローズ return 0; }
出力:
ファイルサイズ: 13バイト
6. 総合例
以下に、ここまで学んだファイル操作の知識を統合したプログラムを示します。このプログラムでは、ファイルのオープンとクローズ、書き込み、読み込み、バイナリファイルの操作、ファイルポインタの位置の操作を行います。
#include <stdio.h> void writeTextFile() { FILE *file = fopen("example.txt", "w"); if (file == NULL) { printf("ファイルを開くことができませんでした。\n"); return; } fprintf(file, "Hello, World!\n"); fclose(file); } void readTextFile() { FILE *file = fopen("example.txt", "r"); char str[100]; if (file == NULL) { printf("ファイルを開くことができませんでした。\n"); return; } fgets(str, sizeof(str), file); printf("読み込んだ文字列: %s\n", str); fclose(file); } void writeBinaryFile() { FILE *file = fopen("example.bin", "wb"); int num = 12345; if (file == NULL) { printf("ファイルを開くことができませんでした。\n"); return; } fwrite(&num, sizeof(int), 1, file); fclose(file); } void readBinaryFile() { FILE *file = fopen("example.bin", "rb"); int num; if (file == NULL) { printf("ファイルを開くことができませんでした。\n"); return; } fread(&num, sizeof(int), 1, file); printf("読み込んだ整数: %d\n", num); fclose(file); } void getFileSize() { FILE *file = fopen("example.txt", "r"); long pos; if (file == NULL) { printf("ファイルを開くことができませんでした。\n"); return; } fseek(file, 0, SEEK_END); pos = ftell(file); printf("ファイルサイズ: %ldバイト\n", pos); fclose(file); } int main() { writeTextFile(); readTextFile(); writeBinaryFile(); readBinaryFile(); getFileSize(); return 0; }
結論
ファイル操作は、Cプログラミングにおいて非常に重要な機能です。適切なファイル操作を学び、効果的にデータを保存、読み込み、操作することで、より高度なプログラムを作成することができます。これらの知識を活用して、実用的なプログラムを作成しましょう。