◎第11回 入出力


下へ一覧へ ○テキスト 5章(5.2) (*注:C言語を使うので大分違う) ○言語によって大きく違う。( OS にも依存する。) ○一般に入出力は難しい → 次回のテーマ(人間とのインタフェース、誤ったデータの処理) ○よく使う入出力 キーボード(標準入力) → ディスプレイ(標準出力) getchar() putchar( c ) 1文字 gets( str ) puts( str ) 文字列(1行) scanf( ... ) printf( ... ) 書式つき
下へ上へ ◎書式つき出力 (formatted output) 〜 printf文 〜 内部形式と文字列表現の変換をする。 ・使用例: 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 を出力(事実上変換しない)。 「文字列の扱い」を参照 ・書式以外の文字はそのまま出力される。 ・% と 書式指定文字列の間に、欄の幅やなどを細かく指定できる(表現指示文字列) (例) "… % - 0 5.3 d …" - 左詰め、右詰め指定。 -:左詰め +:右詰め 0 ゼロサプレス指定。0:数値の入らない桁を0で埋める、省略:空白埋める 5 表示最大桁数。データを表示する桁数を指定 3 数値:少数点以下の桁数指定、文字列:表示する文字数指定 d データ表現の型指定
下へ上へ ◎書式つき入力(formatted input) 〜 scanf文 〜 scanf 「書式が受けつける文字」を読んで変換して代入する。 ・使用例:次の変数宣言があるとする int i; float f; double d; char c; scanf("%s",a); aという配列にキーボードから文字列を入力。 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"でも同じ (***空白文字以外の文字が入力されるまで終らない***) 空白文字は、スペースの他タブ、改行なども含む。 下へ上へ ・書式以外の文字は「必ずそのとおり入力されなければ」ならない。 ・「&」は、変数i、f、dの存在するメモリ内の場所(アドレス)を表す = ポインタ バッファリング:一般に入力は標準入力から1行読んでバッファ(配列)に入れる。 ・scanfを利用する場合の注意点 scanf の場合、受けつけない文字はバッファに残る。 受けつける文字が一つもないときにも、プログラムが正しく動作するためには、 一般に複雑な処理が必要である。
下へ上へ printf/scanf 型と書式一覧 [type] [printf] [scanf] [説明] char c; printf("%c",c); scanf("%c",&c); char s[N]; 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); 浮動小数点 * %e %g でもよい double x; printf("%f",x); scanf("%lf",&x); 倍精度浮動小数点 * printf は倍精度でも %f
下へ上へ ◎ファイル入出力の基本書式 0.宣言 1.オープン 2.読み書き 3.クローズ 0.宣言 (高水準入出力=ストリーム入出力の場合 ) ・ストリーム…ディスクあるいは他の周辺機器と結び付いている データの送出元および行先 ・プログラム中で処理中のファイルを区別する変数を宣言する。 FILE *fp; * "FILE" は、stdio.h の中で、 「ファイル取扱のためのデータを集めた構造体」 として定義されている。 下へ上へ 1.オープン fp=fopen( "ファイル名", "モード" ); <モード> "r" : ファイルを読むとき "w" : ファイルを書くとき * 失敗すると fp は NULL になる。 2.クローズ fclose( fp ); 3.標準入出力 ・stdin, stdout, stderr はプログラム起動、終了時に自動的にオープン/ クローズされている 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 内部形式そのままでファイルの読み書きをする。 同種類の計算機、同じ種類の言語のみでのデータ交換と考えたほうがよい。
下へ上へ ○演習11 これまでのプログラム( 課題・演習・例題等 )では、実行時に、キーボードから 入力していた。これを、ファイル入出力を用いるように書き換えて実行して みよう。ファイル名はプログラム中で固定してもよいし、scanf や gets で 読み込んでもよい。 (注意)読み込みファイルには、最初の行にデータ数、2行目からデータを入れる。 11.1 総和を求めるプログラム( souwa.c)を、 「データを実行時にファイルから読むプログラム」に書き換えよ。 ( 解答 souwaf.c) また以下のデータをコピーして実行せよ。 (data1.dat実行結果1) (data2.dat実行結果2) (data3.dat実行結果3) 11.2 整列プログラム (seitrtu0.c)を、 「データを実行時にファイルから読み、ファイルに書くプログラム」 に書き換えよ。( 解答 seiretu.c) また入力ファイル f1data.datをコピーし、 適当なファイルに書き出せ。(実行結果)
一覧へ上へ ◯レポート課題11 11.1 学生のテストの点数をファイルから読み、平均点と分散を ファイルに書くプログラムを作成せよ。プログラム、入出力2つの ファイルを提出。 *データ型に注意。データ数は各自、自由。 参考:課題3.4、テキストp.42例題2.4 11.2 課題8.3の単語数を数えるプログラム ( 解答例 )を、 「文字列データを実行時にファイルから読み、単語数をファイルに書くプログラム」 に書き換えよ。プログラムと入出力2つのファイルを提出。 解答例のプログラムでなく、自分で作ったプログラムを使ってもよい。 (大ヒント) 【余裕のある人】はここをクリック
一覧へ