Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
fgets() / fputs() / fgetc() / fputc()
テキストファイルを1行単位または1文字単位で読み書きする関数です。ログファイルの解析やテキストデータの加工によく使われます。
構文
// 1行をファイルから読み込みます(改行文字も含みます)。 // 戻り値: 成功時は buf、EOF またはエラー時は NULL。 char *fgets(char *buf, int size, FILE *stream); // 文字列をファイルへ書き込みます('\0' は書き込まれません)。 // 戻り値: 成功時は非負の値、エラー時は EOF。 int fputs(const char *str, FILE *stream); // 1文字をファイルから読み込みます。 // 戻り値: 読み込んだ文字(unsigned char として int にキャスト)、EOF はエラーまたは末尾。 int fgetc(FILE *stream); // 1文字をファイルへ書き込みます。 // 戻り値: 書き込んだ文字、エラー時は EOF。 int fputc(int c, FILE *stream);
関数一覧
| 関数 | 対象 | 概要 |
|---|---|---|
| fgets() | 行読み込み | 最大 size - 1 文字を読み込み末尾に '\0' を付加します。バッファオーバーフローを防げます。 |
| fputs() | 文字列書き込み | 文字列を書き込みます。改行は自動付加されないため必要なら手動で追加します。 |
| fgetc() | 文字読み込み | 1文字ずつ読み込みます。戻り値は int 型で、EOF(-1)と区別するために unsigned char 範囲の値を返します。 |
| fputc() | 文字書き込み | 1文字書き込みます。標準出力に書く場合は putchar() が使えます。 |
| getchar() | 標準入力 | fgetc(stdin) の省略形です。 |
| putchar() | 標準出力 | fputc(c, stdout) の省略形です。 |
サンプルコード
#include <stdio.h>
#include <string.h>
int main(void) {
// fputs でファイルに複数行書き込みます。
FILE *fp = fopen("lines.txt", "w");
if (fp == NULL) { perror("fopen"); return 1; }
fputs("apple\n", fp);
fputs("banana\n", fp);
fputs("cherry\n", fp);
fclose(fp);
// fgets でファイルを1行ずつ読み込みます。
fp = fopen("lines.txt", "r");
if (fp == NULL) { perror("fopen"); return 1; }
char buf[256];
int line_num = 1;
while (fgets(buf, sizeof(buf), fp) != NULL) {
// fgets は改行文字を含むため、末尾の改行を除去します。
buf[strcspn(buf, "\n")] = '\0';
printf("%d: %s\n", line_num++, buf);
}
fclose(fp);
// 出力: 1: apple / 2: banana / 3: cherry
// fgetc で1文字ずつ読み込み文字数を数えます。
fp = fopen("lines.txt", "r");
if (fp == NULL) { perror("fopen"); return 1; }
int ch, char_count = 0;
while ((ch = fgetc(fp)) != EOF) {
char_count++;
}
fclose(fp);
printf("文字数(改行含む): %d\n", char_count); // ファイルの総文字数が出力されます。
return 0;
}
概要
gets() は使用禁止です。バッファサイズを指定できないため、長い行を読み込むとバッファオーバーフローが発生します。代わりに必ずバッファサイズを指定できる『fgets()』を使用してください。
『fgetc()』の戻り値は必ず『int』型で受け取ってください。char 型で受け取ると、char が符号付きの環境では EOF(-1)が 255 と混同され、ループが終わらなくなります。
バイナリファイルの読み書きには改行変換が不要なため、『fread() / fwrite()』を使用してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。