◇下へ・一覧へ
○テキスト
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 を出力(事実上変換しない)。
「文字列の扱い」を参照
書式以外の文字はそのまま出力される。
% と 書式指定文字列の間に、欄の幅やなどを細かく指定できる(表現指示文字列)
(例) "… % - 0 5.3 d …"
- 左詰め、右詰め指定。 -:左詰め +:右詰め
0 ゼロサプレス指定。0:数値の入らない桁を0で埋める、省略:空白埋める
5 表示最大桁数。データを表示する桁数を指定
3 数値:少数点以下の桁数指定、文字列:表示する文字数指定
d データ表現の型指定
◇下へ・上へ
◎入力( scanf 書式つき入力 formatted input)
scanf 「書式が受けつける文字」を読んで変換して代入する。
(例)次の変数宣言があるとする
int i;
float f;
double d;
char c;
scanf("%s", 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[?];/*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 * fp;
(記号 FILE は、<stdio.h>の中で、「ファイル取扱のための
データを集めた構造体」として定義されている。)
◇下へ・上へ
○オープン
fp=fopen( "ファイル名", "モード" );
"モード"はファイルを読むとき "r"
"モード"はファイルを書くとき "w"
失敗すると fp は NULL になる。
○クローズ
fclose( fp );
○標準入出力
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つの
ファイルを提出。
課題6.1や演習11.2が参考になるであろう。データ型に注意。
データ数は各自、自由。
11.2 課題8.3の単語数を数えるプログラム ( 解答例 )を、
「データを実行時にファイルから読み、ファイルに書くプログラム」
に書き換えよ。プログラムと入出力2つのファイルを提出。
解答例のプログラムでなく、自分で作ったプログラムを使ってよい。
(大ヒント)
【余裕のある人】
11.3 11.2で作成したプログラムで、入力ファイル中の文字列が複数行である
(改行を含む)時、すべての単語をカウントできるか確かめ、できない
場合はプログラムを修正し、ファイル中のすべての単語をカウントできる
ようにせよ。
ヒント:関数 feof(fp) を用いるとファイルの終了を知ることができる。
一覧へ