Top Banner
プププププププププ プププププププププ II II 2005 2005 1 1 19 19 9 9 年年年年年年 年年年 年年年年年年 年年年
24

プログラミング演習 II

Jan 02, 2016

Download

Documents

kiayada-rios

プログラミング演習 II. 2005 年 1 月 19 日(第 9 回) 理学部数学科・木村巌. 前回までの復習. 共用体( union type ) 列挙 (enumerated type ) 構造体、構造体のポインタ、 typedef などを用いた、リンクトリストの実装例. 今日学ぶこと. ファイル入出力 標準入出力から・への入出力 ファイルとストリーム ストリームへの入出力 コマンドラインからの入力. ストリーム. ストリーム:入出力できるモノを抽象化した概念 C 言語のプログラムでは、 標準入力(キーボード) 標準出力(画面) - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: プログラミング演習 II

プログラミング演習プログラミング演習 IIII

20052005 年年 11 月 月 1919 日(第日(第 99 回)回)理学部数学科・木村巌理学部数学科・木村巌

Page 2: プログラミング演習 II

前回までの復習前回までの復習 共用体(共用体( union typeunion type )) 列挙列挙 (enumerated type(enumerated type )) 構造体、構造体のポインタ、構造体、構造体のポインタ、 typedeftypedef などなど

を用いた、リンクトリストの実装例を用いた、リンクトリストの実装例

Page 3: プログラミング演習 II

今日学ぶこと今日学ぶこと ファイル入出力ファイル入出力

標準入出力から・への入出力標準入出力から・への入出力 ファイルとストリームファイルとストリーム ストリームへの入出力ストリームへの入出力

コマンドラインからの入力コマンドラインからの入力

Page 4: プログラミング演習 II

ストリームストリーム ストリーム:入出力できるモノを抽象化ストリーム:入出力できるモノを抽象化

した概念した概念 CC 言語のプログラムでは、言語のプログラムでは、

標準入力(キーボード)標準入力(キーボード) 標準出力(画面)標準出力(画面) 標準エラー出力(画面)標準エラー出力(画面)

以上三つが、デフォルトで以上三つが、デフォルトで openopen されていされているる

Page 5: プログラミング演習 II

書式付き入出力書式付き入出力 標準入力・出力への書式付き入出力標準入力・出力への書式付き入出力 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 までを打ち込んまでを打ち込ん

で、コンパイル・実行してみようで、コンパイル・実行してみよう

Page 6: プログラミング演習 II

いろいろな入出力いろいろな入出力 scanf()scanf() は、空白の入った文字列を読み込は、空白の入った文字列を読み込

めないめない gets()gets() は使うべきではないは使うべきではない

読み込んだデータの保存場所が、読み込んだ読み込んだデータの保存場所が、読み込んだデータよりも少ない場合、メモリが上書きさデータよりも少ない場合、メモリが上書きされるれる

fgets()fgets() を使う(後述)を使う(後述)

Page 7: プログラミング演習 II

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 を入力して、コンパイル・実行を入力して、コンパイル・実行してみようしてみよう

Page 8: プログラミング演習 II

ファイル入出力ファイル入出力 ファイルをオープンする:ファイルとスファイルをオープンする:ファイルとス

トリームとを結びつけるトリームとを結びつける ファイル(と結べつけられたストリーファイル(と結べつけられたストリー

ム)を読み書きするム)を読み書きする ファイルをクローズする:ファイルとスファイルをクローズする:ファイルとス

トリームとの結びつきを解消するトリームとの結びつきを解消する

Page 9: プログラミング演習 II

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 をコンパイル・実行してみようをコンパイル・実行してみよう

Page 10: プログラミング演習 II

fopen(), fclose()fopen(), fclose() の使い方の使い方 fopen()fopen() は、ファイルをオープンできなは、ファイルをオープンできな

かった場合、かった場合、 NULLNULL を返すを返す ファイルへの入出力が済んだら、ファイファイルへの入出力が済んだら、ファイ

ルを閉じる:ルを閉じる: fclose()fclose()

Page 11: プログラミング演習 II

ファイルへの出力ファイルへの出力 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() と同じ書式指定が可能と同じ書式指定が可能

Page 12: プログラミング演習 II

ファイルからの入力ファイルからの入力 ファイルからのファイルからの 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 をコンパイル・実行してみようをコンパイル・実行してみよう

Page 13: プログラミング演習 II

バイナリファイルの読み書きバイナリファイルの読み書き テキストファイルとバイナリファイルテキストファイルとバイナリファイル

テキストファイル:人間がそのまま読め、テテキストファイル:人間がそのまま読め、テキストエディタ(メモ帳や秀丸など)で編集キストエディタ(メモ帳や秀丸など)で編集できるできる

バイナリファイル:それ以外バイナリファイル:それ以外 バイナリファイルの利点バイナリファイルの利点

計算機で処理しやすいデータのままでよい計算機で処理しやすいデータのままでよい (人間に読みやすいように加工していない)(人間に読みやすいように加工していない) 処理が速い処理が速い

Page 14: プログラミング演習 II

バイナリファイル書き出しバイナリファイル書き出し 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 をコンパイル・実行してみよをコンパイル・実行してみよ

うう

Page 15: プログラミング演習 II

バイナリファイルの読み込みバイナリファイルの読み込み 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 を入力し、コンパイル・実行を入力し、コンパイル・実行

してみようしてみよう

Page 16: プログラミング演習 II

ランダムアクセスランダムアクセス シーケンシャルアクセス(シーケンシャルアクセス( sequential accesequential acce

ssss )) ファイルの先頭から順番に、データの読み書ファイルの先頭から順番に、データの読み書

きを行うきを行う ランダムアクセス(ランダムアクセス( random accessrandom access ))

ファイルの任意の場所について、データの読ファイルの任意の場所について、データの読み書きを行うみ書きを行う

どの場所から移動を始めるかどの場所から移動を始めるか 現在の位置はどこか(ファイルポジション)現在の位置はどこか(ファイルポジション)

Page 17: プログラミング演習 II

ランダムアクセスランダムアクセス 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 の表を見よの表を見よ

Page 18: プログラミング演習 II

ランダムアクセスしてファイルをランダムアクセスしてファイルを読む読む

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 をコンパイル・実行してみよをコンパイル・実行してみようう

Page 19: プログラミング演習 II

コマンドライン引数を使うコマンドライン引数を使う int main (int ac, char *av[]) int main (int ac, char *av[]) とと main()main() 関数を関数を

宣言する宣言する プログラムの引数(起動時に指定されたプログラムの引数(起動時に指定された

値)を、値)を、 avav という配列を使って受け取るという配列を使って受け取ることが出来ることが出来る acac は、引数の数は、引数の数 avav は、文字列の配列(それぞれが引数)は、文字列の配列(それぞれが引数)

av[0]av[0] は、プログラムの名前が入っているは、プログラムの名前が入っている

Page 20: プログラミング演習 II

簡単な例簡単な例

#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 のように実行してみよのように実行してみよ

Page 21: プログラミング演習 II

コマンドライン引数コマンドライン引数 コマンドライン引数の使い道コマンドライン引数の使い道

プログラムに、処理すべきファイルを指定すプログラムに、処理すべきファイルを指定するる

与える引数によって、挙動を変える与える引数によって、挙動を変える Sample16.cSample16.c をコンパイル・実行してみよをコンパイル・実行してみよ

うう

Page 22: プログラミング演習 II

今日学んだこと今日学んだこと ファイル入出力ファイル入出力

標準入出力から・への入出力標準入出力から・への入出力 ファイルとストリームファイルとストリーム ストリームへの入出力ストリームへの入出力

コマンドラインからの入力コマンドラインからの入力

Page 23: プログラミング演習 II

レポート課題レポート課題 ファイル名を引数として与えると、そのファイル名を引数として与えると、その

ファイルの内容を端末に表示するプログファイルの内容を端末に表示するプログラムラム 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:

Page 24: プログラミング演習 II

レポート課題レポート課題 締め切り:締め切り: 20052005 年年 11 月月 2525 日一杯(日本日一杯(日本

時間で)時間で) 提出:メールで木村(提出:メールで木村( iwaoiwao@@scisci..toyama-utoyama-u

.ac..ac.jpjp)まで.)まで. 感想などあると木村が喜びます感想などあると木村が喜びます