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行ずつコピーする。