◎第11回 入出力
◇下へ・一覧へ
○テキスト
5章(5.2) だが、C言語を使うので大分違う
◇下へ・上へ
○言語で大きく違う。( OS にも依存する。)
○一般に入出力は難しい→
次回のテーマ(人間とのインタフェース、誤ったデータの処理)
◇下へ・上へ
よく使う入出力
標準入力 標準出力
キーボード ディスプレイ
getchar() putchar( c ) 1文字
gets( str ) puts( str ) 文字列(1行)
scanf( ... ) printf( ... ) 書式つき
◇下へ・上へ
◎出力 (printf 書式つき出力 formatted output)
内部形式と文字列表現の変換をする。
printf 書式文字列にしたがって文字列に変換して出力する。
printf("%d", i): int i を、 10 進数文字列に変換して出力する。
printf("%x", i): int i を、 16 進数文字列(0-9a-f)に変換して出力する。
printf("%X", i): int i を、 16 進数文字列(0-9A-F)に変換して出力する。
printf("%f", f); float または double の f を 10 進数文字列に変換して出力する。
printf("%e", f); float または double の f を 指数形式10 進数文字列に変換して
出力する。
printf("%g", f); %f 形式と %e 形式の短い方
printf("%c", i): int i をコードとする文字に変換して出力する。
(事実上変換しない)
printf("%s", s): 文字列 s を出力する。(事実上変換しない)
「文字列の扱い」を参照
書式以外の文字はそのまま出力される。
% と 書式指定文字列の間に、欄の幅やなどを細かく指定できる。
◇下へ・上へ
◎入力( scanf 書式つき入力 formatted input)
scanf 「書式が受けつける文字」を読んで変換して代入する。
次の変数宣言があるとする
int i;
float f;
double d;
char c;
使用例と説明
scanf("%d", &i); 入力文字を 10 進数として int に変換して i に代入
scanf("%x", &i); 入力文字を 16 進数として int に変換して i に代入
scanf("%f", &f); 入力文字を 10 進数(実数)として float に変換して f に代入
scanf("%lf", &d); 入力文字を 10 進数(実数)として double に変換して d に代入
scanf("%c", &c); 入力文字のコードを char に変換して c に代入
(事実上変換しない)
scanf("%i", &i); 入力文字を0で始まれば 8進整数、0x で始まれば16進整数、
それ以外は10進数として int に変換して i に代入
scanf(" "); 空白文字を読み飛ばす。" "が"\n"や"\t"でも同じ
(***空白文字以外の文字が入力されるまで終らない***)
空白文字は、スペースの他タブ、改行なども含む。
◇下へ・上へ
書式以外の文字は「必ずそのとおり入力されなければ」ならない。
バッファリング:一般に入力は標準入力から1行読んでバッファに入れる。
scanfを利用する場合の注意点
scanf の場合、受けつけない文字はバッファに残る。
受けつける文字が一つもないときにも、プログラムが正しく動作するためには、
一般に複雑な処理が必要である。
◇下へ・上へ
printf/scanf 型と書式一覧
type printf scanf 説明
char c; printf("%c",c); scanf("%c",&c);
char s[?];/*string*/printf("%s",s); scanf("%s",s); 文字列
注意: scanfでも & はつけない
int n; printf("%d",n); scanf("%d",&n); 10進整数
int n; printf("%o",n); scanf("%o",&n); 8進整数
int n; printf("%x",n); scanf("%x",&n); 16進整数
int n; scanf("%i",&n); 10/8/16進整数
unsigned int n; printf("%u",n); scanf("%u",&n); 符号無し10進整数
float x; printf("%f",x); scanf("%f",&x); 浮動小数点
%f の代わりに%e %g でもよい
double x; printf("%f",x); scanf("%lf",&x); 倍精度浮動小数点
注意: printf は倍精度でも %f
◇下へ・上へ
◎ファイル入出力
0.宣言
1.オープン
2.読み書き
3.クローズ
○宣言
( 高水準入出力=ストリーム入出力の場合 )
プログラム中で処理中のファイルを区別する変数を宣言する。
FILE * f;
( 記号 FILE は、 の中でファイル取扱のためのデータを集めた
構造体として定義されている。)
◇下へ・上へ
○オープン
f=fopen( "ファイル名", "モード" );
"モード"はファイルを読むとき "r"
"モード"はファイルを書くとき "w"
失敗すると f は NULL になる。
○クローズ
fclose( f );
○標準入出力
stdin, stdout, stderr はあらかじめ fopen されている。
stdin 標準入力 通常はキーボード (< でリダイレクトされる)
stdout 標準出力 通常はディスプレイ (> でリダイレクトされる)
stderr 標準エラー出力 通常はディスプレイ
単純なリダイレクトではそのまま画面に出力される。
◇下へ・上へ
○入出力処理
fscanf( stdin, .... ) = scanf( .... )
fprintf( stdout, .... = printf( .... )
fgets( buff, ∞, stdin ) ≒ gets( buff ) (詳しい説明)
fputs( buff, stdout ) ≒ puts( buff ) (詳しい説明)
getc( stdin ) = getchar()
putc( c, stdout ) = putchar( c )
( fread fwrite 内部形式そのままでファイルの読み書きをする。
同種類の計算機、同じ種類の言語のみでのデータ交換と
考えたほうがよい。)
◇下へ・上へ
○例
1. souwaf.c : 総和を求めるプログラム データを実行時にファイルから読む
2. seiretu.c : 整列プログラム データを実行時にファイルから読みファイルに書く
◇下へ・上へ
○演習(提出する必要はありません)
(これまでの課題を提出していない人は、それを優先してください)
これまでのプログラム( 課題・演習・例題等 )においては
実行時にキーボードから入力していた。
これを、ファイル入出力を用いるようにしてみよ。
ファイル名はプログラム中で固定してもよいし、
scanf や gets で読み込んでもよい
◇一覧へ・上へ
◯課題
ありません。これまでの課題を提出していない人は、それをしてください。
一覧へ