こんにちは、もがちゃんです
今回の記事では、ファイルから1文字(1バイト)ずつ入力する際に利用するfgetc関数の使い方を、簡単なサンプルプログラムとともに説明します
目次
fgetcの構文
#include <stdio.h>
int fgetc(FILE *stream);
fgetcの説明
fgetcは、streamで指定されたファイルポインタに紐づくファイルから、1文字(1バイト)取得する
streamが指す入力ストリームのファイル終了表示子がセットされておらず、かつそのストリーム上に次の文字が存在する場合、fgetc関数は、その文字をunsigned char型として取り込み、int型に変換する。
JISX3010 プログラム言語C
入力したいファイルに紐づくファイルポインタを指定します
(fopen関数の返却値を指定します)
ファイルからの読み取りに
成功した場合、読み取った文字を返す
ファイルの終わりを指しているの場合は、EOFを返す
エラーの場合は、EOFを返す
そのストリームのファイル終了表示子がセットされている場合、又はストリームがファイルの終わりに達している場合、そのストリームのファイル終了表示子をセットし、fgetc関数は,EOFを返す。
その他の場合、fgetc関数は,streamが指す入力ストリームから次の文字を返す。読取りエラーが発生した場合、そのストリームのエラー表示子をセットし、fgetc関数は,EOFを返す。
JISX3010 プログラム言語C
fgetcの使い方サンプル
fgetcを使ったサンプルソースと実行結果を紹介します
1 2A b*@あ
#include <stdio.h>
/*
* fgetcのサンプル
*/
int main(int argc, char *argv[]) {
FILE *fp = NULL;
fp = fopen("input.txt","r");
if(fp == NULL) {
fprintf(stdout, "fopen エラー\n");
return -1;
}
int c = '#include <stdio.h>
/*
* fgetcのサンプル
*/
int main(int argc, char *argv[]) {
FILE *fp = NULL;
fp = fopen("input.txt","r");
if(fp == NULL) {
fprintf(stdout, "fopen エラー\n");
return -1;
}
int c = '\0';
while((c = fgetc(fp)) != EOF) {
fprintf(stdout, "c[0x%02x][%c]\n", c, c);
}
if(fp != NULL) {
if(fclose(fp) != 0){
fprintf(stdout, "fclose エラー\n");
return -2;
}
}
}
';
while((c = fgetc(fp)) != EOF) {
fprintf(stdout, "c[0x%02x][%c]\n", c, c);
}
if(fp != NULL) {
if(fclose(fp) != 0){
fprintf(stdout, "fclose エラー\n");
return -2;
}
}
}

半角スペースも、タブ文字も取得できます
あ(マルチバイト文字)の部分も、1バイト毎の取得になります
fgetcのまとめ
streamに標準入力(stdin)を指定した場合は、getcharと同じ動作をします
fgetcは1文字(1バイト)ずつの入力になるので、ファイルからの入力で使用するには効率が悪いですが、標準入力からの入力(キーボードからの入力)の場合は、キーボード入力時の文字を読み取るために使用することがあります