ホーム » スタッフ » 斉藤徹 » 高水準入出力関数

2004年9月
« 8月   10月 »
 1234
567891011
12131415161718
19202122232425
2627282930  

最近の投稿(電子情報)

アーカイブ

カテゴリー

高水準入出力関数

C言語の入出力関数の説明として、1文字系、1行系の説明を行う。

  • getchar(),putchar(),fgetc(),fputchar()
  • gets(),puts(),fgets(),fputs()
  • stdin,stdout,stderr
  • 入出力バッファと高水準入出力関数
  • バッファオーバーフロー

fopen,fcloseの説明が夏休み前なので、復習の意味で説明。

/* fscanf,fprint説明 */
FILE* fp ;
fp = fopen( "abc.txt" , "rt" ) ;
if ( fp != NULL ) {
int x ;
while( fscanf( "%d" , &x ) == 1 )
printf( "%d" , x ) ;
fclose( fp ) ;
}

1文字入出力の説明。char型 'a' であることの明記と、 EOF(End Of File)の説明。EOFの入力方法の説明がまだ。

このプログラムの説明で、"This"と入力しても、"TThHiIsS"と 表示されない点を述べ、入出力のバッファリングが機能している点を明言。

/* getchar,putchar説明 */
int c ;
while( (c = getchar()) != EOF ) {
if ( 'a' <= c && c <= 'z' )
putchar( c - 'a' + 'A' ) ;
else
putchar( c ) ;
}

入力用と出力用の2系統のファイルポインタを使う例で、fgetsの説明。

/* fgets説明 */
FILE* fp_in ;
FILE* fp_out ;
fp_in = fopen( "in.txt" , "rt" ) ;
if ( fp_in != NULL ) {
if ( (fp_out = fopen( "out.txt" , "wt" )) != NULL ) {
char buff[ 100 ] ;
while( fgets( buff , 100 , fp_in ) != NULL )
fputs( buff , fp_out ) ;
fclose( fp_out ) ;
}
fclose( fp_in ) ;
}

安全な入力

行入力の説明で、getsは使うな!と明言したので、 その理由として、バッファオーバーランを説明し、その安全対策を説明する。

/* 危険なコード */
char s[100] ;
scanf( "%s" , s ) ;
/* 安全な入力 */
char s[ 100 ] ;
int  x ;
char buff[ 100 ] ;
while( fgets( buff , 100 , stdin ) != NULL ) {
if ( sscanf( buff , "%s %d" , s , &x ) == 2 ) {
:
}
}

標準入出力

前のコード中の、stdin の説明として、 標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr) を説明する。