ホーム » スタッフ » 斉藤徹 » 1文字/1行・入出力関数

2012年7月
« 6月   8月 »
1234567
891011121314
15161718192021
22232425262728
293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

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 ) ;
}