プログラミング演習
プログラミング演習 II II
2005 2005
年年1 1
月 月19 19
日(第日(第9 9
回)回)理学部数学科・木村巌 理学部数学科・木村巌
前回までの復習 前回までの復習
共用体(共用体(union type union type
))
列挙列挙(enumerated type (enumerated type
))
構造体、構造体のポインタ、構造体、構造体のポインタ、typedef typedef
などなど を用いた、リンクトリストの実装例を用いた、リンクトリストの実装例
今日学ぶこと 今日学ぶこと
ファイル入出力ファイル入出力
標準入出力から・への入出力標準入出力から・への入出力
ファイルとストリームファイルとストリーム
ストリームへの入出力ストリームへの入出力
コマンドラインからの入力コマンドラインからの入力ストリーム ストリーム
ストリーム:入出力できるモノを抽象化ストリーム:入出力できるモノを抽象化 した概念した概念 C C
言語のプログラムでは、言語のプログラムでは、
標準入力(キーボード)標準入力(キーボード)
標準出力(画面)標準出力(画面)
標準エラー出力(画面)標準エラー出力(画面)以上三つが、デフォルトで
以上三つが、デフォルトで
open open
されていされてい書式付き入出力 書式付き入出力
標準入力・出力への書式付き入出力標準入力・出力への書式付き入出力 printf(), scanf() printf(), scanf()
printf() printf()
の変換仕様:表の変換仕様:表12-1 12-1
((p. 388 p. 388
)) scanf() scanf()
の変換仕様:表の変換仕様:表12-2 12-2
((p. 389 p. 389
))
出力幅、出力精度の指定出力幅、出力精度の指定 Sample1.c Sample1.c
からからSample4.c Sample4.c
までを打ち込んまでを打ち込ん で、コンパイル・実行してみようで、コンパイル・実行してみよう
いろいろな入出力 いろいろな入出力
scanf() scanf()
は、空白の入った文字列を読み込は、空白の入った文字列を読み込 めないめない gets() gets()
は使うべきではないは使うべきではない
読み込んだデータの保存場所が、読み込んだ読み込んだデータの保存場所が、読み込んだ データよりも少ない場合、メモリが上書きさ データよりも少ない場合、メモリが上書きさ れるれる fgets() fgets()
を使う(後述)を使う(後述)1 1
文字入出力文字入出力 int getchar(void), void putchar(int) int getchar(void), void putchar(int)
getchar() getchar()
の返値はの返値はint. int.
((char char
ではない)ではない) EOF EOF
((End Of File End Of File
)が、多くの環境で)が、多くの環境で-1 -1
とと いう値を割り当てられるが、いう値を割り当てられるが、
char char
だと符号なだと符号な しなので、しなので、
-1 -1
をを255 255
と勘違いしてしまうと勘違いしてしまう Sample7.c Sample7.c
を入力して、コンパイル・実行を入力して、コンパイル・実行 してみようしてみよう
ファイル入出力 ファイル入出力
ファイルをオープンする:ファイルとスファイルをオープンする:ファイルとス トリームとを結びつけるトリームとを結びつける
ファイル(と結べつけられたストリーファイル(と結べつけられたストリー ム)を読み書きするム)を読み書きする
ファイルをクローズする:ファイルとスファイルをクローズする:ファイルとス トリームとの結びつきを解消するトリームとの結びつきを解消する
fopen(), fclose() fopen(), fclose()
ファイルを開く:ファイルを開く:FILE *fopen (char *fn, char * FILE *fopen (char *fn, char * mode);
mode);
fn fn
で指定されたファイル名を持つファイルをで指定されたファイル名を持つファイルを、、
mode mode
で指定されたモードでオープンするで指定されたモードでオープンする FILE FILE
型の構造体へのポインタが返値.これを型の構造体へのポインタが返値.これを ファイルポインタという.ファイルポインタという.
ファイルポインタは、ストリームという概念の実ファイルポインタは、ストリームという概念の実 体体
ファイルモード:表ファイルモード:表12-3 12-3
((p. 402 p. 402
)参照)参照 Sample8.c Sample8.c
をコンパイル・実行してみようをコンパイル・実行してみようfopen(), fclose()
fopen(), fclose()
の使い方の使い方 fopen() fopen()
は、ファイルをオープンできなは、ファイルをオープンできな かった場合、かった場合、
NULL NULL
を返すを返す
ファイルへの入出力が済んだら、ファイファイルへの入出力が済んだら、ファイ ルを閉じる:ルを閉じる:
fclose() fclose()
ファイルへの出力 ファイルへの出力
fputs(char *str, FILE *fp); fputs(char *str, FILE *fp);
ファイルポインタファイルポインタfp fp
へ、へ、str str
を出力するを出力する fprintf(FILE *fp, char *fmt, …); fprintf(FILE *fp, char *fmt, …);
ファイルポインタファイルポインタfp fp
へ、書式指定へ、書式指定fmt fmt
でで 出力する.出力する.
printf() printf()
と同じ書式指定が可能と同じ書式指定が可能ファイルからの入力 ファイルからの入力
ファイルからのファイルからの1 1
行入力行入力
fgets(char *buf, size_t n, FILE *fp); fgets(char *buf, size_t n, FILE *fp);
ファイルポインタファイルポインタ
fp fp
から、から、buf buf
へ、へ、n byte n byte
読み込む読み込む 読み込むバイト数を指定できるので、バッファをあ読み込むバイト数を指定できるので、バッファをあ ふれさせる心配がない(
ふれさせる心配がない(
gets() gets()
の代わりに使う)の代わりに使う)
大量のデータを入力大量のデータを入力
fscanf(FILE *fp, str *fmt, …); fscanf(FILE *fp, str *fmt, …);
書式指定書式指定
fmt fmt
に従って、ファイルポインタに従って、ファイルポインタfp fp
から読から読バイナリファイルの読み書き バイナリファイルの読み書き
テキストファイルとバイナリファイルテキストファイルとバイナリファイル テキストファイル:人間がそのまま読め、テキテキストファイル:人間がそのまま読め、テキ ストエディタ(メモ帳や秀丸など)で編集でき ストエディタ(メモ帳や秀丸など)で編集でき るる
バイナリファイル:それ以外バイナリファイル:それ以外
バイナリファイルの利点バイナリファイルの利点 計算機で処理しやすいデータのままでよい計算機で処理しやすいデータのままでよい
(人間に読みやすいように加工していない)(人間に読みやすいように加工していない)
処理が速い処理が速い
バイナリファイル書き出し バイナリファイル書き出し
fopen() fopen()
で、モードにで、モードにb b
を加えると、バイを加えると、バイ ナリファイルとしてオープンするナリファイルとしてオープンする
size_t fwrite (void *buf, size_t n, size_t c, FIL size_t fwrite (void *buf, size_t n, size_t c, FIL E *fp);
E *fp);
buf buf
のデータを、のデータを、n byte n byte
分、分、c c
回、ファイ回、ファイ ルポインタルポインタ
fp fp
へ書き出すへ書き出すSample13.c
Sample13.c
をコンパイル・実行してみよをコンパイル・実行してみよバイナリファイルの読み込み バイナリファイルの読み込み
size_t fread (void *buf, size_t n, size_t c, FILE size_t fread (void *buf, size_t n, size_t c, FILE
*fp);
*fp);
ファイルポインタファイルポインタfp fp
から、から、n byte, c n byte, c
回、回、buf buf
へ読み込むへ読み込む Sample14.c Sample14.c
を入力し、コンパイル・実行を入力し、コンパイル・実行 してみようしてみよう
ランダムアクセス ランダムアクセス
シーケンシャルアクセス(シーケンシャルアクセス(sequential acces sequential acces s s
)) ファイルの先頭から順番に、データの読み書ファイルの先頭から順番に、データの読み書 きを行うきを行う
ランダムアクセス(ランダムアクセス(random access random access
)) ファイルの任意の場所について、データの読ファイルの任意の場所について、データの読 み書きを行う
み書きを行う
ランダムアクセス ランダムアクセス
int fseek(FILE *fp, size_t n, int WHENCE); int fseek(FILE *fp, size_t n, int WHENCE);
ファイルポインタファイルポインタfp fp
のファイルの、のファイルの、WHENC WHENC E E
で指定される位置から、で指定される位置から、n n
バイト移動するバイト移動する WHENCE WHENCE
の部分は、の部分は、SEEK_SET, SEEK_CUR, SEEK_SET, SEEK_CUR, SEEK_END
SEEK_END
のいずれか.意味は、教科書のいずれか.意味は、教科書p. 41 p. 41
7 7
の表を見よの表を見よランダムアクセスしてファイルを ランダムアクセスしてファイルを
読む読む
size_t fread(void *BUF, size_t SIZE, size_t C size_t fread(void *BUF, size_t SIZE, size_t C OUNT, FILE *FP);
OUNT, FILE *FP);
ファイルポインタファイルポインタFP FP
のファイルから、のファイルから、B B UF UF
に、に、SIZE SIZE
バイト、バイト、COUNT COUNT
回読み込回読み込 むむ Sample15.c Sample15.c
をコンパイル・実行してみよをコンパイル・実行してみよ ううコマンドライン引数を使う コマンドライン引数を使う
int main (int ac, char *av[]) int main (int ac, char *av[])
ととmain() main()
関数を関数を 宣言する宣言する
プログラムの引数(起動時に指定されたプログラムの引数(起動時に指定された 値)を、値)を、av av
という配列を使って受け取るという配列を使って受け取ることが出来る ことが出来る
ac ac
は、引数の数は、引数の数 av av
は、文字列の配列(それぞれが引数)は、文字列の配列(それぞれが引数) av[0] av[0]
は、プログラムの名前が入っているは、プログラムの名前が入っている簡単な例簡単な例
#include <stdio.h>
#include <stdio.h>
int main (int ac, char *av[]) int main (int ac, char *av[]) { {
printf (“ac = %d, av[0] = %s, av[1] = %s.\n”, printf (“ac = %d, av[0] = %s, av[1] = %s.\n”, ac, av[0], av[1]);
ac, av[0], av[1]);
return 0;
return 0;
} }
上記を入力(上記を入力(
Sample.c Sample.c
)し、コンパイル・実行してみよう)し、コンパイル・実行してみようコマンドライン引数 コマンドライン引数
コマンドライン引数の使い道コマンドライン引数の使い道
プログラムに、処理すべきファイルを指定すプログラムに、処理すべきファイルを指定す るる
与える引数によって、挙動を変える与える引数によって、挙動を変える Sample16.c Sample16.c
をコンパイル・実行してみよをコンパイル・実行してみよ うう今日学んだこと 今日学んだこと
ファイル入出力ファイル入出力
標準入出力から・への入出力標準入出力から・への入出力
ファイルとストリームファイルとストリーム
ストリームへの入出力ストリームへの入出力
コマンドラインからの入力コマンドラインからの入力レポート課題 レポート課題
ファイル名を引数として与えると、そのファイル名を引数として与えると、その ファイルの内容を端末に表示するプログ ファイルの内容を端末に表示するプログ ラムラムmycat-n.c mycat-n.c
を作れ.ただし、行の先頭を作れ.ただし、行の先頭に、行番号を表示すること.
に、行番号を表示すること.
実行例:実行例:$ ./mycat-n.exe llist.h
1: typedef struct _Node { 2: char *contents;
3: struct _Node *next;
4: } *Node;
5:
レポート課題 レポート課題