Post on 02-Jan-2016
description
プログラミング演習プログラミング演習 IIII
20052005 年年 11 月 月 1919 日(第日(第 99 回)回)理学部数学科・木村巌理学部数学科・木村巌
前回までの復習前回までの復習 共用体(共用体( union typeunion type )) 列挙列挙 (enumerated type(enumerated type )) 構造体、構造体のポインタ、構造体、構造体のポインタ、 typedeftypedef などなど
を用いた、リンクトリストの実装例を用いた、リンクトリストの実装例
今日学ぶこと今日学ぶこと ファイル入出力ファイル入出力
標準入出力から・への入出力標準入出力から・への入出力 ファイルとストリームファイルとストリーム ストリームへの入出力ストリームへの入出力
コマンドラインからの入力コマンドラインからの入力
ストリームストリーム ストリーム:入出力できるモノを抽象化ストリーム:入出力できるモノを抽象化
した概念した概念 CC 言語のプログラムでは、言語のプログラムでは、
標準入力(キーボード)標準入力(キーボード) 標準出力(画面)標準出力(画面) 標準エラー出力(画面)標準エラー出力(画面)
以上三つが、デフォルトで以上三つが、デフォルトで openopen されていされているる
書式付き入出力書式付き入出力 標準入力・出力への書式付き入出力標準入力・出力への書式付き入出力 printf(), scanf()printf(), scanf() printf()printf() の変換仕様:表の変換仕様:表 12-1 12-1 (( p. 388p. 388 )) scanf()scanf() の変換仕様:表の変換仕様:表 12-2 12-2 (( p. 389p. 389 )) 出力幅、出力精度の指定出力幅、出力精度の指定 Sample1.cSample1.c からから Sample4.cSample4.c までを打ち込んまでを打ち込ん
で、コンパイル・実行してみようで、コンパイル・実行してみよう
いろいろな入出力いろいろな入出力 scanf()scanf() は、空白の入った文字列を読み込は、空白の入った文字列を読み込
めないめない gets()gets() は使うべきではないは使うべきではない
読み込んだデータの保存場所が、読み込んだ読み込んだデータの保存場所が、読み込んだデータよりも少ない場合、メモリが上書きさデータよりも少ない場合、メモリが上書きされるれる
fgets()fgets() を使う(後述)を使う(後述)
11 文字入出力文字入出力 int getchar(void), void putchar(int)int getchar(void), void putchar(int) getchar()getchar() の返値はの返値は int. int. (( charchar ではない)ではない)
EOFEOF (( End Of FileEnd Of File )が、多くの環境で)が、多くの環境で -1-1 とという値を割り当てられるが、いう値を割り当てられるが、 charchar だと符号なだと符号なしなので、しなので、 -1-1 をを 255255 と勘違いしてしまうと勘違いしてしまう
Sample7.cSample7.c を入力して、コンパイル・実行を入力して、コンパイル・実行してみようしてみよう
ファイル入出力ファイル入出力 ファイルをオープンする:ファイルとスファイルをオープンする:ファイルとス
トリームとを結びつけるトリームとを結びつける ファイル(と結べつけられたストリーファイル(と結べつけられたストリー
ム)を読み書きするム)を読み書きする ファイルをクローズする:ファイルとスファイルをクローズする:ファイルとス
トリームとの結びつきを解消するトリームとの結びつきを解消する
fopen(), fclose()fopen(), fclose()
ファイルを開く:ファイルを開く: FILE *fopen (char *fn, char *FILE *fopen (char *fn, char *mode);mode);
fnfn で指定されたファイル名を持つファイルを、で指定されたファイル名を持つファイルを、modemode で指定されたモードでオープンするで指定されたモードでオープンする
FILEFILE 型の構造体へのポインタが返値.これ型の構造体へのポインタが返値.これをファイルポインタという.をファイルポインタという. ファイルポインタは、ストリームという概念のファイルポインタは、ストリームという概念の
実体実体 ファイルモード:表ファイルモード:表 12-312-3 (( p. 402p. 402 )参照)参照 Sample8.cSample8.c をコンパイル・実行してみようをコンパイル・実行してみよう
fopen(), fclose()fopen(), fclose() の使い方の使い方 fopen()fopen() は、ファイルをオープンできなは、ファイルをオープンできな
かった場合、かった場合、 NULLNULL を返すを返す ファイルへの入出力が済んだら、ファイファイルへの入出力が済んだら、ファイ
ルを閉じる:ルを閉じる: fclose()fclose()
ファイルへの出力ファイルへの出力 fputs(char *str, FILE *fp);fputs(char *str, FILE *fp); ファイルポインタファイルポインタ fpfp へ、へ、 strstr を出力するを出力する fprintf(FILE *fp, char *fmt, …);fprintf(FILE *fp, char *fmt, …); ファイルポインタファイルポインタ fpfp へ、書式指定へ、書式指定 fmtfmt でで
出力する.出力する. printf()printf() と同じ書式指定が可能と同じ書式指定が可能
ファイルからの入力ファイルからの入力 ファイルからのファイルからの 11 行入力行入力
fgets(char *buf, size_t n, FILE *fp);fgets(char *buf, size_t n, FILE *fp); ファイルポインタファイルポインタ fpfp から、から、 bufbuf へ、へ、 n byten byte 読み込む読み込む 読み込むバイト数を指定できるので、バッファをあ読み込むバイト数を指定できるので、バッファをあ
ふれさせる心配がない(ふれさせる心配がない( gets()gets() の代わりに使う)の代わりに使う) 大量のデータを入力大量のデータを入力
fscanf(FILE *fp, str *fmt, …);fscanf(FILE *fp, str *fmt, …); 書式指定書式指定 fmtfmt に従って、ファイルポインタに従って、ファイルポインタ fpfp から読から読
み込むみ込む Sample12.cSample12.c をコンパイル・実行してみようをコンパイル・実行してみよう
バイナリファイルの読み書きバイナリファイルの読み書き テキストファイルとバイナリファイルテキストファイルとバイナリファイル
テキストファイル:人間がそのまま読め、テテキストファイル:人間がそのまま読め、テキストエディタ(メモ帳や秀丸など)で編集キストエディタ(メモ帳や秀丸など)で編集できるできる
バイナリファイル:それ以外バイナリファイル:それ以外 バイナリファイルの利点バイナリファイルの利点
計算機で処理しやすいデータのままでよい計算機で処理しやすいデータのままでよい (人間に読みやすいように加工していない)(人間に読みやすいように加工していない) 処理が速い処理が速い
バイナリファイル書き出しバイナリファイル書き出し fopen()fopen() で、モードにで、モードに bb を加えると、バイを加えると、バイ
ナリファイルとしてオープンするナリファイルとしてオープンする size_t fwrite (void *buf, size_t n, size_t c, FILsize_t fwrite (void *buf, size_t n, size_t c, FIL
E *fp);E *fp); bufbuf のデータを、のデータを、 n byten byte 分、分、 cc 回、ファイ回、ファイ
ルポインタルポインタ fpfp へ書き出すへ書き出す Sample13.cSample13.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); ファイルポインタファイルポインタ fpfp から、から、 n byte, cn byte, c 回、回、
bufbuf へ読み込むへ読み込む Sample14.cSample14.c を入力し、コンパイル・実行を入力し、コンパイル・実行
してみようしてみよう
ランダムアクセスランダムアクセス シーケンシャルアクセス(シーケンシャルアクセス( sequential accesequential acce
ssss )) ファイルの先頭から順番に、データの読み書ファイルの先頭から順番に、データの読み書
きを行うきを行う ランダムアクセス(ランダムアクセス( random accessrandom access ))
ファイルの任意の場所について、データの読ファイルの任意の場所について、データの読み書きを行うみ書きを行う
どの場所から移動を始めるかどの場所から移動を始めるか 現在の位置はどこか(ファイルポジション)現在の位置はどこか(ファイルポジション)
ランダムアクセスランダムアクセス int fseek(FILE *fp, size_t n, int WHENCE);int fseek(FILE *fp, size_t n, int WHENCE);
ファイルポインタファイルポインタ fpfp のファイルの、のファイルの、 WHENCWHENCEE で指定される位置から、で指定される位置から、 nn バイト移動するバイト移動する
WHENCEWHENCE の部分は、の部分は、 SEEK_SET, SEEK_CUR, SEEK_SET, SEEK_CUR, SEEK_ENDSEEK_END のいずれか.意味は、教科書のいずれか.意味は、教科書 p. 4p. 41717 の表を見よの表を見よ
ランダムアクセスしてファイルをランダムアクセスしてファイルを読む読む
size_t fread(void *BUF, size_t SIZE, size_t Csize_t fread(void *BUF, size_t SIZE, size_t COUNT, FILE *FP);OUNT, FILE *FP);
ファイルポインタファイルポインタ FPFP のファイルから、のファイルから、 BBUFUF に、に、 SIZESIZE バイト、バイト、 COUNTCOUNT 回読み込回読み込むむ
Sample15.cSample15.c をコンパイル・実行してみよをコンパイル・実行してみようう
コマンドライン引数を使うコマンドライン引数を使う int main (int ac, char *av[]) int main (int ac, char *av[]) とと main()main() 関数を関数を
宣言する宣言する プログラムの引数(起動時に指定されたプログラムの引数(起動時に指定された
値)を、値)を、 avav という配列を使って受け取るという配列を使って受け取ることが出来ることが出来る acac は、引数の数は、引数の数 avav は、文字列の配列(それぞれが引数)は、文字列の配列(それぞれが引数)
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.cSample.c )し、コンパイル・実行してみよ)し、コンパイル・実行してみよ
うう ./Sample abc def./Sample abc def のように実行してみよのように実行してみよ
コマンドライン引数コマンドライン引数 コマンドライン引数の使い道コマンドライン引数の使い道
プログラムに、処理すべきファイルを指定すプログラムに、処理すべきファイルを指定するる
与える引数によって、挙動を変える与える引数によって、挙動を変える Sample16.cSample16.c をコンパイル・実行してみよをコンパイル・実行してみよ
うう
今日学んだこと今日学んだこと ファイル入出力ファイル入出力
標準入出力から・への入出力標準入出力から・への入出力 ファイルとストリームファイルとストリーム ストリームへの入出力ストリームへの入出力
コマンドラインからの入力コマンドラインからの入力
レポート課題レポート課題 ファイル名を引数として与えると、そのファイル名を引数として与えると、その
ファイルの内容を端末に表示するプログファイルの内容を端末に表示するプログラムラム mycat-n.cmycat-n.c を作れ.ただし、行の先頭を作れ.ただし、行の先頭に、行番号を表示すること.に、行番号を表示すること.
実行例:実行例:
ヒント:ヒント: Sample12.c, Sample16.c.Sample12.c, Sample16.c.
$ ./mycat-n.exe llist.h 1: typedef struct _Node { 2: char *contents; 3: struct _Node *next; 4: } *Node; 5:
レポート課題レポート課題 締め切り:締め切り: 20052005 年年 11 月月 2525 日一杯(日本日一杯(日本
時間で)時間で) 提出:メールで木村(提出:メールで木村( iwaoiwao@@scisci..toyama-utoyama-u
.ac..ac.jpjp)まで.)まで. 感想などあると木村が喜びます感想などあると木村が喜びます