[C言語] ファイルに書き込みする方法
C言語でファイルに書き込みを行うには、標準ライブラリのstdio.h
を使用します。
まず、fopen
関数を用いてファイルを開きます。書き込みモードには"w"
を指定します。
次に、fprintf
やfputs
、fwrite
などの関数を使ってデータを書き込みます。
書き込みが完了したら、fclose
関数でファイルを閉じることを忘れないでください。
これにより、データがファイルに正しく保存されます。
ファイルへの書き込み
C言語でファイルにデータを書き込む方法は複数あります。
ここでは、fprintf
、fputs
、fwrite
の各関数を使った書き込み方法について解説します。
fprintf関数の使い方
fprintf関数
は、フォーマットされたデータをファイルに書き込むために使用されます。
printf関数
と似ていますが、出力先がファイルである点が異なります。
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "w"); // ファイルを開く
if (file == NULL) {
perror("ファイルオープンエラー");
return 1;
}
// ファイルにフォーマットされた文字列を書き込む
fprintf(file, "名前: %s, 年齢: %d\n", "太郎", 25);
fclose(file); // ファイルを閉じる
return 0;
}
example.txtの内容:
名前: 太郎, 年齢: 25
この例では、fprintf
を使って、文字列と整数をフォーマットしてファイルに書き込んでいます。
fopen
でファイルを開き、fclose
でファイルを閉じることを忘れないようにしましょう。
fputs関数での文字列書き込み
fputs関数
は、文字列をそのままファイルに書き込むために使用されます。
改行を含める必要がある場合は、文字列に\n
を追加します。
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "w"); // ファイルを開く
if (file == NULL) {
perror("ファイルオープンエラー");
return 1;
}
// ファイルに文字列を書き込む
fputs("こんにちは、世界!\n", file);
fclose(file); // ファイルを閉じる
return 0;
}
example.txtの内容:
こんにちは、世界!
この例では、fputs
を使って、文字列をそのままファイルに書き込んでいます。
fprintf
と異なり、フォーマット指定は行いません。
fwrite関数でのバイナリデータ書き込み
fwrite関数
は、バイナリデータをファイルに書き込むために使用されます。
データのサイズと個数を指定して書き込みます。
#include <stdio.h>
int main() {
FILE *file = fopen("example.bin", "wb"); // バイナリモードでファイルを開く
if (file == NULL) {
perror("ファイルオープンエラー");
return 1;
}
int data[] = {1, 2, 3, 4, 5};
size_t dataSize = sizeof(data) / sizeof(data[0]);
// バイナリデータを書き込む
fwrite(data, sizeof(int), dataSize, file);
fclose(file); // ファイルを閉じる
return 0;
}
example.binの内容:
バイナリデータが書き込まれています(人間が読める形式ではありません)
この例では、fwrite
を使って、整数の配列をバイナリ形式でファイルに書き込んでいます。
バイナリモードでファイルを開くために、"wb"
を指定しています。
エラーハンドリング
ファイル操作を行う際には、エラーハンドリングが重要です。
ファイルが正しく開けなかったり、書き込みが失敗した場合に適切な処理を行うことで、プログラムの信頼性を向上させることができます。
ここでは、ファイル操作におけるエラーハンドリングの方法を解説します。
ファイルオープン時のエラー処理
ファイルを開く際にfopen関数
を使用しますが、ファイルが存在しない、またはアクセス権がない場合などにエラーが発生することがあります。
fopen
が失敗した場合、NULL
が返されるため、これをチェックしてエラー処理を行います。
#include <stdio.h>
int main() {
FILE *file = fopen("nonexistent.txt", "r"); // 存在しないファイルを開く
if (file == NULL) {
perror("ファイルオープンエラー");
return 1;
}
fclose(file);
return 0;
}
この例では、fopen
が失敗した場合にperror関数
を使ってエラーメッセージを表示しています。
perror
は、標準エラー出力にエラーメッセージを出力するために使用されます。
書き込み時のエラー処理
ファイルへの書き込み中にエラーが発生することもあります。
例えば、ディスク容量が不足している場合などです。
書き込み関数の戻り値を確認することで、エラーを検出できます。
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "w");
if (file == NULL) {
perror("ファイルオープンエラー");
return 1;
}
if (fprintf(file, "データを書き込みます\n") < 0) {
perror("書き込みエラー");
fclose(file);
return 1;
}
fclose(file);
return 0;
}
この例では、fprintf
の戻り値をチェックして、書き込みが成功したかどうかを確認しています。
エラーが発生した場合には、perror
を使ってエラーメッセージを表示します。
perror関数とstrerror関数の活用
perror関数
とstrerror関数
は、エラーメッセージを表示するために使用されます。
perror
は、直前に発生したエラーに対するメッセージを表示し、strerror
はエラー番号を指定してメッセージを取得します。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
FILE *file = fopen("nonexistent.txt", "r");
if (file == NULL) {
// perrorを使ってエラーメッセージを表示
perror("ファイルオープンエラー");
// strerrorを使ってエラーメッセージを取得
printf("エラー: %s\n", strerror(errno));
return 1;
}
fclose(file);
return 0;
}
この例では、perror
とstrerror
の両方を使ってエラーメッセージを表示しています。
errno
は、直前に発生したエラーの番号を保持するグローバル変数です。
strerror
を使うことで、エラー番号に対応するメッセージを取得できます。
応用例
ファイルへの書き込みは、さまざまな応用が可能です。
ここでは、テキストファイルへのログ出力、バイナリファイルへのデータ保存、構造体データのファイルへの書き込みについて解説します。
テキストファイルへのログ出力
プログラムの動作を記録するために、ログファイルを使用することがあります。
fprintf関数
を使って、ログメッセージをテキストファイルに書き込むことができます。
#include <stdio.h>
#include <time.h>
void logMessage(const char *message) {
FILE *logFile = fopen("log.txt", "a"); // 追記モードでファイルを開く
if (logFile == NULL) {
perror("ログファイルオープンエラー");
return;
}
// 現在時刻を取得
time_t now = time(NULL);
char *timeStr = ctime(&now);
timeStr[strlen(timeStr) - 1] = '\0'; // 改行を削除
// ログメッセージを書き込む
fprintf(logFile, "[%s] %s\n", timeStr, message);
fclose(logFile);
}
int main() {
logMessage("プログラムが開始されました");
logMessage("エラーが発生しました");
return 0;
}
log.txtの内容:
[2023-10-01 12:00:00] プログラムが開始されました
[2023-10-01 12:01:00] エラーが発生しました
この例では、logMessage関数
を使って、現在時刻とメッセージをログファイルに書き込んでいます。
fopen
のモードに"a"
を指定することで、既存の内容に追記します。
バイナリファイルへのデータ保存
バイナリファイルは、データを効率的に保存するために使用されます。
fwrite関数
を使って、データをバイナリ形式でファイルに書き込むことができます。
#include <stdio.h>
int main() {
FILE *file = fopen("data.bin", "wb"); // バイナリモードでファイルを開く
if (file == NULL) {
perror("ファイルオープンエラー");
return 1;
}
double values[] = {3.14, 2.71, 1.62};
size_t count = sizeof(values) / sizeof(values[0]);
// バイナリデータを書き込む
fwrite(values, sizeof(double), count, file);
fclose(file);
return 0;
}
data.binの内容:
バイナリデータが書き込まれています(人間が読める形式ではありません)
この例では、fwrite
を使って、double型
の配列をバイナリ形式でファイルに書き込んでいます。
バイナリモードでファイルを開くために、"wb"
を指定しています。
ファイルへの構造体データの書き込み
構造体をファイルに保存することで、複雑なデータを効率的に管理できます。
fwrite関数
を使って、構造体をバイナリ形式でファイルに書き込むことができます。
#include <stdio.h>
typedef struct {
char name[50];
int age;
double height;
} Person;
int main() {
FILE *file = fopen("people.bin", "wb"); // バイナリモードでファイルを開く
if (file == NULL) {
perror("ファイルオープンエラー");
return 1;
}
Person person = {"太郎", 30, 175.5};
// 構造体データを書き込む
fwrite(&person, sizeof(Person), 1, file);
fclose(file);
return 0;
}
people.binの内容:
バイナリデータが書き込まれています(人間が読める形式ではありません)
この例では、fwrite
を使って、Person
構造体のデータをバイナリ形式でファイルに書き込んでいます。
構造体のポインタを渡すことで、構造体全体を一度に書き込むことができます。
まとめ
ファイルへの書き込みは、C言語プログラミングにおいて重要な操作の一つです。
この記事では、fprintf
、fputs
、fwrite
を使ったファイル書き込みの方法と、エラーハンドリング、応用例について解説しました。
これらの知識を活用して、より信頼性の高いプログラムを作成してください。