◎第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つのファイルを提出。
解答例のプログラムでなく、自分で作ったプログラムを使ってもよい。
(大ヒント)
【余裕のある人】はここをクリック