C言語 | 高度な機能 | ファイルとストリーム - fopen(), fclose(), fflush() など
C標準ライブラリには、ファイルを読み書きするストリーム関数が用意されている。
ファイルを開く、閉じる
stdio.h で宣言される FILE * ストリームを使う。
FILE *fopen(const char *filename, const char *mode);
int fclose(FILE *stream);
int fflush(FILE *stream);
| モード | 意味 |
|---|---|
"r" |
既存ファイルを読み取る |
"w" |
書き込み用にファイルを作成または切り詰める |
"a" |
追記する。必要ならファイルを作成する |
"r+" |
既存ファイルを読み書きする |
"w+" |
読み書き用にファイルを作成または切り詰める |
"a+" |
読み取りと追記を行う |
fopen() は失敗すると NULL を返す。fclose() はストリームを閉じ、バッファーに残った出力を書き込む。直ちに書き込む必要がある場合は fflush() を呼び出す。
コード1
#include <stdio.h>
int main() {
FILE *file = fopen("test.txt" , "r");
if (file == NULL) {
printf("test.txtを開けません。\n");
return 1;
}
fclose(file);
return 0;
}
文字の読み書き
1文字ずつ処理するには fgetc() と fputc() を使う。
int fgetc(FILE *stream);
int fputc(int character, FILE *stream);
fgetc() はファイル末尾またはエラーで EOF を返す。feof() と ferror() で状態を区別できる。
コード2
#include <stdio.h>
int main() {
FILE *file = fopen("test.txt" , "r");
int value;
if (file == NULL) return 1;
while((value = fgetc(file)) != EOF)
printf("%c" , value);
if (ferror(file)) printf("ストリームエラーが発生しました。\n");
fclose(file);
return 0;
}
行単位の読み書き
テキスト行には fgets() と fputs() を使う。
char *fgets(char *buffer, int size, FILE *stream);
int fputs(const char *text, FILE *stream);
コード3
#include <stdio.h>
#define BUFFER_SIZE 1024
int main() {
FILE *input = fopen("in.txt" , "r");
FILE *output = fopen("out.txt" , "w");
char line[BUFFER_SIZE];
if (input == NULL || output == NULL) return 1;
while(fgets(line , BUFFER_SIZE , input) != NULL)
fputs(line , output);
fclose(input);
fclose(output);
return 0;
}
このプログラムはテキストファイルを1行ずつコピーする。