1文字/1行・入出力関数
ファイル入出力の課題中であるが、並行して1文字/1行・入出力関数の説明を行う。
1文字入出力関数
1文字単位の入出力関数は、以下のとおり。
int fgetc( fp ) // ファイルから1文字入力 getchar() // 標準入力から1文字入力 fputc( c , fp ) // ファイルに1文字出力 putchar( c ) // 標準出力に1文字出力
fgetc,getcharは、読み込みデータがこれ以上無い場合には、EOF(#defineで-1)が 帰ってくる。使い方の一例は以下のとおり。
FILE* fp ; if ( (fp = fopen( "hoge.txt" , "rt" )) != NULL ) { int c ; while( (c = fgetc( fp )) != EOF ) { putchar( c ) ; // ファイルからのデータを標準出力に } fclose( fp ) ; }
fgetc(),getchar() は、読み込んだ1文字データの文字コードを返す。 これ以上読むデータが無い場合は、-1(EOF)を返す。 このため、文字コード(256通り)と"-1"を合わせた257通りが考えられるため、 読み込んだ値を保存する c は、char型でなくint型でなければならない。
入力バッファリング
getchar() の例として、入力の小文字を大文字に変換するプログラムは、 以下のようになる。このプログラムを動かすと、本来であれば1文字入力・変換・出力 の繰り返しであり、キーボードで"abc"と入力すれば、1文字毎に大文字が出力され、 画面には、"aAbBcC"と表示されると思われがちである。
int c ; while( (c = getchar()) != EOF ) { if ( c >= 'a' && c <= 'z' ) c = c-'a' + 'A' ; putchar( c ) ; }
しかしながら、getchar()などの関数は、バッファリングが行われるため、 特にgetcharでは、行単位のバッファリングが行われる。 プログラムで入力処理が始まると、1行分のデータが溜まるまで、getchar()からは 値が読み取れない。1行のデータが溜まった時点で、その蓄えられたバッファから、 1文字づつ読み取られ処理が繰り返される。
1行入出力関数
1行単位のファイル入出力では、fgets() , fputs() が使われる。 標準出力の文字列出力では、puts()が使われる。
FILE* fp ; if ( (fp = fopen( "in.txt" , "rt" )) != NULL ) { char str[ 100 ] ; while( fgets( str , sizeof( str ) , fp ) != NULL ) { puts( str ) ; } fclose( fp ) ; }