◎第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 で読み込んでもよい
一覧へ上へ ◯課題 ありません。これまでの課題を提出していない人は、それをしてください。
一覧へ