スライド

復習:コンパイル・実行
計算機科学概論
第11回
標準入出力ライブラリ(1)
• サンプルプログラムをコピー
% cp ~gmituhar/math/lecture/cs/
program/chcase.c .
• コンパイル
% cc chcase.c
• 実行
% ./a.out < chcase.c
標準入出力ライブラリ
• 今回は入出力に標準入出力ライブラリを
使用
‒入出力を行う標準的な方法
•バッファリング
•書式指定(例: printf)
‒#include <stdio.h>
‒どのような関数があるかは % man stdio
式としての代入とその値
• Cでは代入「a = exp」は式
– 「a = exp;」は文
• 「代入された値」が(式としての)代入の値
–x = y = z = 0
• x = (y = (z = 0)) と同じ
• 式「z = 0」「y = (z = 0)」の値は 0
• 結局 x, y, z に 0 が代入される
• 優先順位に注意
– while ((c = getchar()) != EOF)
文字単位の入出力
(対象: 標準入出力)
• int getchar()
– 標準入力から1文字読み、返り値とする
– 入力の終わりに達したかエラーの場合は
EOF(stdio.hで定義されている定数)を返す
– 返り値の型は char ではなく int
• 文字が読めた場合の返り値とEOFとを区別
• 返り値を変数に代入してからチェックするときに注意
• int putchar(int c)
– 標準出力に1文字書く
– エラーの場合はEOF, それ以外は書いた文字を返す
式としての代入
while ((c = getchar()) != EOF) {
:
}
c = getchar();
while (c != EOF) {
:
c = getchar();
}
• 同じ内容を複数回記述することを避ける
• よく使われるパターン以外で使いすぎる
と、プログラムが読みにくくなる
文字単位の入出力
(対象: ファイル)
終了ステータス
• main は int型の返り値を持つ関数
–何を返す? … 終了ステータス
•0
… 正常終了(真)
• 0以外 … 異常終了(偽)
• void exit(int status)
‒終了ステータスを設定し、プログラムを終了
‒main以外からも終了ステータスを設定可
ファイルのオープン
• FILE *fopen(char *path, char *mode)
‒pathで指定されたパス名のファイルを新しいス
トリームに結び付け、そのストリームを返す
‒modeでどの種類の操作を行うか指定
•"r" … 読み出し専用
•"w" … 書きこみ専用
‒エラーのときは0(どこも指していないポイン
タ。NULLと書くこともあり)を返す
クローズ
• 標準入出力ライブラリではファイルに対して直
接入出力を行うことはしない
‒ ストリームを経由する
– FILE *stream;
• 典型的な使用手順
1. ファイルをストリームに結び付ける(オープン)
2. ストリームに対し入出力を行う
3. ファイルとストリームの結び付きを解除(クローズ)
ストリームに対する入出力
• int getc(FILE *stream)
• int putc(int c, FILE *stream)
– getchar, putchar のストリーム指定版
• 以下のストリームはオープンせずに使用可能
– stdin(標準入力), stdout(標準出力), stderr(標準エラー
出力)
– getchar() は getc(stdin) と同じ
– putchar(c) は putc(c, stdout) と同じ
コマンド引数の処理
• int fclose(FILE *stream)
• 関数 main の引数は通常0個か2個
• 実はプロセス終了時に自動的にクローズが行わ
れる
• int main(int argc, char *argv[])
‒ 同時にオープンできるファイルの数には上限あり
‒ 特に順次ファイルを処理していくプログラムでは、
不要になったストリームは直ちにクローズすべき
–argc … (コマンド名も含めた)引数の個数
–argv …引数を表す文字列(の先頭要素へのポインタ)の
配列(の先頭要素へのポインタ)
• 「char **argv」と書いても同じ
• argv[i] (0 ≤ i < (argcの値))がi番目の引数の文字列を
表す
• argv[argc] は NULL
例: % ./a.out first second third
argv[0]
’.’ ’/’ ’a’ ’.’ ’o’ ’u’ ’t’ ’\0’
argv
’f’ ’i’ ’r’ ’s’ ’t’ ’\0’
’s’ ’e’ ’c’ ’o’ ’n’ ’d’ ’\0’
4
argc
0
’t’ ’h’ ’i’ ’r’ ’d’ ’\0’
argv[argc]