◎第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 を出力(事実上変換しない)。
                 「文字列の扱い」を参照
書式以外の文字はそのまま出力される。

% と 書式指定文字列の間に、欄の幅やなどを細かく指定できる(表現指示文字列)
  (例) "… % - 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) を用いるとファイルの終了を知ることができる。
一覧へ