プログラミング及び演習 第1回 講義概容・実行制御

Similar documents
プログラミング及び演習 第1回 講義概容・実行制御

Microsoft Word - Cプログラミング演習(9)

スライド タイトルなし

Taro-ファイル処理(公開版).jtd

PowerPoint プレゼンテーション

Microsoft Word - no15.docx

Microsoft Word - Cプログラミング演習(10)

情報処理演習 B8クラス

gengo1-12

ファイル入出力

Microsoft PowerPoint pptx

ファイル入出力

gengo1-12

Prog1_12th

2006年10月5日(木)実施

プログラミング演習3 - Cプログラミング -

C言語入門

gengo1-12

slide4.pptx

計算機プログラミング

Microsoft Word - no204.docx

Microsoft PowerPoint - 第3回目.ppt [互換モード]

ex14.dvi

演算増幅器

プログラミング演習3 - Cプログラミング -

Microsoft PowerPoint - CproNt11.ppt [互換モード]

Microsoft PowerPoint - kougi6.ppt

PowerPoint Presentation

Microsoft PowerPoint - 14th.ppt [互換モード]

Microsoft Word - Cプログラミング演習(12)

02: 変数と標準入出力

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

プログラミング基礎

02: 変数と標準入出力

PowerPoint プレゼンテーション

memo

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

slide5.pptx

Microsoft PowerPoint - prog04.ppt

Microsoft PowerPoint - kougi8.ppt

Original : Hello World! (0x0xbfab85e0) Copy : Hello World! (0x0x804a050) fgets mstrcpy malloc mstrcpy (main ) mstrcpy malloc free fgets stream 1 ( \n

1. ファイルにアクセスするには ファイルにアクセスするには 1. ファイルを開く 2. アクセスする 3. ファイルを閉じるという手順を踏まなければなりません 1.1. ファイルを読み込む まずはファイルの内容を画面に表示させるプログラムを作りましょう 開始 FILE *fp char fname

Microsoft PowerPoint - prog06.ppt

全体ロードマップ インターネット電話 音の符号化 ( 信号処理 ) 今日 音の録音 再生 ネットワーク ( ソケット ) プログラミング ファイル入出力 インターネットの基礎 C プログラミング基礎

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

02: 変数と標準入出力

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

PowerPoint プレゼンテーション

memo

ポインタ変数

ポインタ変数

C言語講座 ~ファイル入出力編~

PowerPoint プレゼンテーション

データ構造

練習&演習問題

Microsoft PowerPoint - 10Com2.ppt

Microsoft Word - 06

02: 変数と標準入出力

目次

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

Microsoft PowerPoint pptx

※ ポイント ※

A/B (2018/10/19) Ver kurino/2018/soft/soft.html A/B

PowerPoint Presentation

PowerPoint Presentation

file"a" file"b" fp = fopen("a", "r"); while(fgets(line, BUFSIZ, fp)) {... fclose(fp); fp = fopen("b", "r"); while(fgets(line, BUFSIZ, fp)) {... fclose

ポインタ変数

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

PowerPoint プレゼンテーション

mstrcpy char *mstrcpy(const char *src); mstrcpy malloc (main free ) stdio.h fgets char *fgets(char *s, int size, FILE *stream); s size ( )

プログラミング実習I

AquesTalk プログラミングガイド

Microsoft PowerPoint - kougi2.ppt

AquesTalk Win Manual

プログラミング演習 土曜日(Q組)

データ構造

Prog2_10th

Microsoft PowerPoint - lec10.ppt

ディジタル信号処理

joho07-1.ppt

1 C STL(1) C C C libc C C C++ STL(Standard Template Library ) libc libc C++ C STL libc STL iostream Algorithm libc STL string vector l

PowerPoint プレゼンテーション

ディジタル信号処理

プログラミング及び演習 第1回 講義概容・実行制御

Cプログラミング1(再) 第2回

PowerPoint プレゼンテーション - 物理学情報処理演習

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - CproNt02.ppt [互換モード]

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

格子点データの解析 1 月平均全球客観解析データの解析 客観解析データや衛星観測データのような格子点データは バイナリ形式のデータファイルに記録されていることが多いです バイナリ形式のデータファイルは テキスト形式の場合とは異なり 直接中身を見ることができません プログラムを書いてデータを読み出して

PowerPoint プレゼンテーション

Microsoft PowerPoint - 11.pptx

ゲームエンジンの構成要素

C プログラミング 1( 再 ) 第 4 回 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 1

Microsoft PowerPoint - kougi11.ppt

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

memo

comment.dvi

PowerPoint プレゼンテーション

卒 業 研 究 報 告.PDF

Transcription:

プログラミング及び演習 第 6 回ファイル ( 教科書第 9 章 ) (2014/05/23) 講義担当情報連携統轄本部情報戦略室大学院情報科学研究科メディア科学専攻教授森健策

本日の講義 演習の内容 ファイル第 9 章 講義 演習ホームページ http://www.newves.org/~mori/14programming ところで, 現在までに教科書第 1-8 章を終了 段々難しくなっていると思いますか? 5 簡単 4 ふつう 3 まだまだついてゆける 2 もうそろそろギブアップ! 1 もうだめ

出席と質問 NUCT にて 回答 1 前ページの回答 回答 2 先週の演習に一言 回答 3 学修は順調に進んでいますか? 出席回答は 1 限中に 質問は 14programming @ mori.m.is.nagoya-u.ac.jp へ

ストリーム ストリームとは? プログラム デバイス ( ファイル, プリンタ等 ) との間のデータの流れ テキストストリーム 行の集まり 0 以上の文字からなり n で終わる システムによってはテキストストリームと他の表現形式 (CR+LF) との相互変換が必要な場合がある バイナリストリーム 内部データを記録するための加工されていないバイトの連続

ストリーム ストリームとは? プログラム デバイス ( ファイル, プリンタ等 ) との間のデータの流れ テキストストリーム 行の集まり 0 以上の文字からなり n で終わる システムによってはテキストストリームと他の表現形式 (CR+LF) との相互変換が必要な場合がある バイナリストリーム 内部データを記録するための加工されていないバイトの連続

ファイルへの直接読み書き ファイルを直接読み書きするには ファイルを open ファイルからの読みこみ (or ファイルへの書き込み ) ファイル操作関数を用いる ファイルを close ( 特に書き込みの場合 ) ファイルを正しくクローズしないと正しく書き込まれない場合がある

ファイルの open #include <stdio.h> FILE *fopen( char filename[], char openmode[]); filename[] で指定された名前を持つファイルを openmode[] で指定されたモードでオープン オープンに成功した場合 FILE 型構造体へのポインタを返す オープンに失敗した場合 NULL ポインタを返す

使用例 fopen FILE *fp; fp = fopen("test.dat", "rt"); FILE *fp; fp = fopen("test.dat", "wb"); char filename[256]; strcpy(filename, "/home/mori/test.dat"); if ((fp=fopen(filename,"rb"))==null){ printf("error n"); return(1); }

ファイル名とパスの指定 実行ファイルと同じ位置のディレクトリ ( カレントディレクトリ ) に書き出す場合 "test.dat" "./test.dat" と解釈される 相対パスで書き出す場合 "../../test.dat" (Windows では ) ".... test.dat" ( で を表すことに注意 ) 絶対パスで書き出す場合 "/tmp/test.dat" (Windows では ) " tmp test.dat" ( で を表すことに注意 )

オープンモード 各指定子と読み書き開始位置 r 読み込み先頭 w 書き込み先頭ファイルが存在しない場合作成される r+ 読み込み + 書き込み先頭 w+ 読み込み + 書き込み先頭ファイルが存在しない場合作成される a 追加終端ファイルが存在しない場合作成される a+ 読み込み + 追加終端ファイルが存在しない場合作成される

オープンモードオプション r, r+, w, w+, a, a+ の後に続ける b と t の 2 つ b t バイナリモードバイナリデータを取り扱うときに明示 テキストモード UNIX 改行コード LF (0x0a) Windows 改行コード CR+LF (0x0d+0x0a) 読み込み時に 0x0a に統一書き込み時にプラットフォームに適した形へ

ファイルの close #include <stdio.h> int fclose(file *fp); fopen() で返されたFILE 型ポインタfpが制御しているストリームをcloseする 正常にcloseできたときは0 失敗したときにはEOFを返す

書式付入力関数 #include <stdio.h> int fscanf(file *fp, char format[], ); int fprintf(file *fp, char format[], ); scanf, printfのファイル入出力版 fpで指し示されるファイルに対して入出力 fscanf(stdin, ) と書くとscanf( ) に相当 fprintf(stdout, ) と書くとprintf( ) に相当

1 文字単位入出力関数 int fgetc(file *fp); int getc(file *fp); fp( で指し示されるストリーム ) から一文字入力 getchar() と同様の動作 int fputc(int c, FILE *fp); int putc(int c, FILE *fp); fp で指し示されるストリームに一文字出力 putchar() と同様の動作

文字列単位の入出力関数 char *fgets(char s [], int num, FILE *fp); num-1 文字分もしくは改行文字が検出されるまで, もしくは EOF が検出されるまで fp から s に読み込む 読み込まれた文字列の最後には終端文字が加えられる char fputs(char s[], FILE *fp) 文字列を fp に書き出す ( 終端文字は書き出されない )

直接入出力関数 変数 定数の値を文字ではなく内部表現そのままで書き出す関数 多バイトデータを書き出すときはデータの量が少なくなるメリット ( 例画像, 音 ) 例 ) int a = 2354543; 直接表現 6f ed 23 00 (0x0023ed6f) (=4byte) 文字書き出し "2354543"+" " (7byte+1) 内部表現は環境により異なるので十分注意 ファイルに記録されている内容を正しく読み書き出きない可能性 Intel 形式とモトローラ形式 Big Endean と Little Endean

直接入力関数 (fwrite) size_t fwrite(void ptr[], size_t size, size_t nitems, FILE *stream); 配列 ptr から size バイトのバイト列 ( データ列 ) を最大 nitems 個 fp から書き出す nitems 個書き出したとき,EOF を検出したとき, もしくは, エラーが検出されたとき終了し, 書き出された個数を返す 使い方 #define ARRAYSIZE 100 FILE *fp; int data[arraysize]; data の中に何か値を入れる fp=fopen("test.dat","wb'); fwrite((void *)data, sizeof(int), ARRAYSIZE, fp); fclose(fp);

直接入力関数 (fread) size_t fread(void ptr[], size_t size, size_t nitems, FILE *fp); 配列 ptr に size バイトのバイト列 ( データ列 ) を最低限 nitems 個 fp から読み出す nitems 個読み出したとき,EOF を検出したとき, もしくは, エラーが検出されたとき終了し, 読み出された個数を返す 使い方 #define ARRAYSIZE 100 FILE *fp; int data[arraysize]; fp=fopen("test.dat","rb"); fread((void *)data, sizeof(int), ARRAYSIZE, fp); fclose(fp);

fwrite による書き出し (lec6-fwrite.c) #include <stdio.h> #define ARRAYSIZE 100 main() { FILE *fp; int data[arraysize]; int i; fp=fopen("test.dat","wb"); for(i=0;i<arraysize;i++){ data[i]=i*10; } fwrite(data, sizeof(int), ARRAYSIZE, fp); fclose(fp); }

fread による読み出し (lec6-fread.c) #include <stdio.h> #define ARRAYSIZE 100 main() { FILE *fp; int data[arraysize]; int i; fp=fopen("test.dat","rb"); fread(data, sizeof(int), ARRAYSIZE, fp); for(i=0;i<arraysize;i++){ printf( "data[%d]=%d n",i,data[i]); } fclose(fp); }

書き出されたファイルの中を覗く od コマンドを利用 (od -t x1 test.dat とタイプ ) taka{mori}36: od -t x1 test.dat 0000000 00 00 00 00 0a 00 00 00 14 00 00 00 1e 00 00 00 0000020 28 00 00 00 32 00 00 00 3c 00 00 00 46 00 00 00 0000040 50 00 00 00 5a 00 00 00 64 00 00 00 6e 00 00 00 0000060 78 00 00 00 82 00 00 00 8c 00 00 00 96 00 00 00 0000100 a0 00 00 00 aa 00 00 00 b4 00 00 00 be 00 00 00 0000120 c8 00 00 00 d2 00 00 00 dc 00 00 00 e6 00 00 00 0000140 f0 00 00 00 fa 00 00 00 04 01 00 00 0e 01 00 00 0000160 18 01 00 00 22 01 00 00 2c 01 00 00 36 01 00 00 0000200 40 01 00 00 4a 01 00 00 54 01 00 00 5e 01 00 00 0000220 68 01 00 00 72 01 00 00 7c 01 00 00 86 01 00 00 0000240 90 01 00 00 9a 01 00 00 a4 01 00 00 ae 01 00 00 0000260 b8 01 00 00 c2 01 00 00 cc 01 00 00 d6 01 00 00 0000300 e0 01 00 00 ea 01 00 00 f4 01 00 00 fe 01 00 00 0000320 08 02 00 00 12 02 00 00 1c 02 00 00 26 02 00 00 0000340 30 02 00 00 3a 02 00 00 44 02 00 00 4e 02 00 00

先頭 (0 バイト目 ) ファイル内での位置 ファイルも単なるバイト列の並び ファイル 入出力位置 ファイルに対して入出力を行う度順次移動

任意の位置に移動するには? int fseek(file *fp, long offset, int origin); fp で示されるストリームでの入出力位置を変更する関数 どこから (origin) から数えて何バイト目 (offset) で設定 SEEK_SET 先頭から数えて offset バイト目 SEEK_CUR 現在位置から数えて offset バイト目 SEEK_END 終わりから数えて offset バイト目 SEEK_SET, SEEK_CUR, SEEK_END は stdio.h で定義

任意の位置への移動 ファイルの内容 "ABCDEFGHIJKLMNOPQRSTUVWXYZ n" どんな文字が表示されるか? fseek(fp, 4, SEEK_SET); printf("%c n", fgetc(fp)); fseek(fp, 5, SEEK_CUR); printf("%c", fgetc(fp)); fseek(fp, -3, SEEK_CUR); printf("%c", fgetc(fp)); fseek(fp, -10, SEEK_END); printf("%c", fgetc(fp)); 現在位置は常に次に読み書きすべき場所を表す 読み書き後は現在位置は次の位置に移動

いまはどこ? long ftell(file *stream); strem における現在の入出力位置を返す 例 int a; a=ftell(fp); printf( "Current file-position indicator %d n",a);

ファイルの状態を調べる関数 int feof(file *fp); fp で示されたストリームの読み込みが終わりに達しているかを調べる 達している場合 達していない場合 0 int ferror(file *fp); 0 以外の値 fp で示されたストリームへの読み書きでエラーが起きているかを調べる 起きている場合 起きていない場合 0 0 以外の値

コマンドライン引数 コマンド行での引数をプログラムで取り扱う "testprog abc.txt def.txt" "abc.txt", "def.txt" の文字列をプログラムで受け取るには? main(int argc, char *argv[]) argc 引数の数 char *argv[0], char *argv[1] は引数の文字列を表す. 一番最後には NULL が入る char *argv[0] は入力コマンド自体を表す

argc, argv の使用例 #include <stdio.h> main(int argc, char *argv[]) { int i; printf( "argc %d n", argc); for(i=0;i<argc;i++){ printf("argv[%d]= %s n", i, argv[i]); } } taka{mori}89:./a.out fsdf dsf ds fsd fsdfsdfsf dsf dsf dsaf sa argc 10 argv[0]=./a.out argv[1]= fsdf argv[2]= dsf argv[3]= ds argv[4]= fsd argv[5]= fsdfsdfsf argv[6]= dsf argv[7]= dsf argv[8]= dsaf argv[9]= sa

argc, argv の使用例 #include <stdio.h> main(int argc, char *argv[]) { int i; printf( "argc %d n", argc); for(i=1;i<argc;i++){ printf("argv[%d]= %d n", i, atoi(argv[i])); } } taka{mori}96:./a.out 10 20 43 643 argc 5 argv[0]=./a.out argv[1]= 10 argv[2]= 20 argv[3]= 43 argv[4]= 643

ファイルをコピー (lec6-copy.c) #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { int c; FILE *in, *out; if(argc!=3){ fprintf(stderr, "Illegal command line n"); exit(exit_failure); } if((in=fopen(argv[1],"r"))==null){ fprintf(stderr, "Source file open error n"); exit(exit_failure); } if((out=fopen(argv[2],"w"))==null){ fprintf(stderr, "Destination file open error n"); exit(exit_failure); } while((c=fgetc(in))!=eof){ fputc(c,out); } fclose(in); fclose(out); }

ストリームとファイル デバイスとの結びつけ ストリームはファイル デバイスと オープンすることで結びつけ クローズすることで結びつきを解消