10: ファイル入出力 Linux にログインし、以下の講義ページ を開いておくこと teachers/w483692/CPR1/ 2015-06-15 C プログラミング入門 総機 1 ( 月 1) 1.

Slides:



Advertisements
Similar presentations
プログラミング演習 II 2005 年 1 月 19 日(第 9 回) 理学部数学科・木村巌. 前回までの復習 共用体( union type ) 共用体( union type ) 列挙 (enumerated type ) 列挙 (enumerated type ) 構造体、構造体のポインタ、
Advertisements

1 全体の流れ 画像ファイルを開き,画像データをメモリ上にロード メモリ上にロードした画像データに処理を加える 処理後のデータを出力ファイルに書き出す 画像データ用に確保したメモリを解放.
画像情報処理 1 プログラミング課題 知的画像処理研究室 M2 大村 瑞穂. 目次 プログラミング課題の準備 – ファイルのダウンロード・解凍・コンパイル サンプルプログラムの説明 画像処理の方法 レポートに載せる画像について 例題と第 1 回レポート課題.
情報処理演習 (9)グラフィックス システム科学領域 日浦 慎作.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
情報処理演習C2 ファイル操作について (2).
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
画像ファイル(ppm)の読み書き 画像データ用のメモリ確保・解放
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
第13回 プログラミングⅡ 第13回
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
記憶クラス 変数をどのような記憶領域に割り当てるかを指定するのが記憶クラス 記憶クラスには、自動変数、静的変数、外部変数などがある。
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第8回 プログラミングⅡ 第8回
情報処理Ⅱ 第13回 2006年1月20日(金).
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
ファイル操作と文字列の利用.
画像ファイル(ppm)の読み書き 画像データ用のメモリ確保・解放
2014/05/02 知的画像処理研究室 M1 中津美冴 画像情報処理1 ~画像処理プログラミング~ 2014/05/02 知的画像処理研究室 M1 中津美冴
情報処理Ⅱ 第13回 2004年01月25日(火).
10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
Cプログラミング演習 第6回 ファイル処理と配列.
プログラミング 2 ファイル処理.
プログラミング論 ファイル入出力
プログラミング入門2 ファイルの入出力 ポインタ 芝浦工業大学情報工学科 青木 義満
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
iioLoadFile()とiioMallocImageBuffer()の補足
Cプログラミング演習 第7回 メモリ内でのデータの配置.
iioLoadFile()とiioMallocImageBuffer()の補足
iioLoadFile()とiioMallocImageBuffer()の補足
プログラミング 4 記憶の割り付け.
プログラミング演習I 2003年6月25日(第10回) 木村巌.
画像処理プログラムの説明.
プログラミング論 ファイル処理 (中級編)
第7回 プログラミングⅡ 第7回
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
プログラミング論 ファイル入出力
デジタル画像とC言語.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
09: ポインタ・文字列 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
プログラミング基礎a 第7回 C言語によるプログラミング入門 ファイル入出力
プログラミング基礎B 文字列の扱い.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
第4回 ファイル入出力方法.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
11: 動的メモリ確保 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
プログラミング演習I 2003年7月2日(第11回) 木村巌.
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
11: 動的メモリ確保 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
11: 動的メモリ確保 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
情報処理Ⅱ 2007年1月26日(金).
ファイル操作について (1).
モジュール分割.
プログラミング基礎a 第7回 C言語によるプログラミング入門 ファイル入出力
11: 動的メモリ確保 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
Cp-1. Microsoft Visual Studio 2019 C++ の使い方 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
全体の流れ 画像ファイルを開き,画像データをメモリ上にロード メモリ上にロードした画像データに処理を加える
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
Presentation transcript:

10: ファイル入出力 Linux にログインし、以下の講義ページ を開いておくこと teachers/w483692/CPR1/ C プログラミング入門 総機 1 ( 月 1) 1

標準ライブラリ関数によりファイルの出力を 行う 画像ファイルの生成を例題として  配列の作成を復習する  関数を作ってプログラムを構造化する C プログラミング入門 総機 1 ( 月 1) 2 今日の内容

文字コードの羅列でできているもの C プログラミング入門 総機 1 ( 月 1) 3 テキストファイル Dear all, I hope you and your family are fine.... Dear all, I hope you and your family are fine.... Linux のコンソールで, od -ctx1 ファイル名 とすると、文字コードを表示できる。 Linux のコンソールで, od -ctx1 ファイル名 とすると、文字コードを表示できる。

Portable gray map image  他に、 PPM ( カラー ), PBM (2 値 ) がある 単純なフォーマット テキスト形式とバイナリ形式がある C プログラミング入門 総機 1 ( 月 1) 4 PGM 画像ファイル P P PGM 画像ファイルの例 ( テキスト形式 ) PGM 画像 (4×4 pixel) header 画素値 横幅 高さ [pixels] フォーマットを識別する マジックナンバー 画素値の最大値 (= 白 )

1. テキストエディタで、前頁のテキストファイ ルを作り、 mini.pgm というファイル名で 保存する 2. ダブルクリックして画像ビューアで開く  4x4 ピクセルなので、拡大しないと見えない 手で作ると大変なので、プログラムで作りだ そうというのが、今日の本題です。 C プログラミング入門 総機 1 ( 月 1) 5 実演 : PGM 画像ファイルを手で作る

1. ファイルを開く  プログラムから指定してた名前のファイルに読み 書きできるように準備すること 2. ファイルを読む・ファイルに書き込む  I/O (input/output) と呼ばれる  通常は、ファイルの内容を順番にアクセスする ( シーケンシャルアクセス ; sequential access)  ⇄ ランダムアクセス (random access) 3. ファイルを閉じる  ファイルの処理を完了し、バッファに残っている ものを全て出力する C プログラミング入門 総機 1 ( 月 1) 6 ファイル入出力の流れ

C プログラミング入門 総機 1 ( 月 1) 7 例題 : PGM ファイルの出力 #include int main(void) { FILE *fp; fp = fopen("mini.pgm", "w"); fprintf(fp, "P2\n"); fprintf(fp, "4 4\n"); fprintf(fp, "255\n"); fprintf(fp, " \n");... fclose(fp);... 開いたファイルを識別するため情報を指すポインタ ファイルポインタと呼ばれる。変数名は何でもよい 開いたファイルを識別するため情報を指すポインタ ファイルポインタと呼ばれる。変数名は何でもよい ファイルを mini.pgm という名前で、 書きこみモードで開く fopen(), fprintf(), fclose() などは stdio.h で 宣言されている ファイル閉じる ファイルに文字列を書きこむ

fopen() にファイル名と モードを指定 FILE 型へのポインタが返 る  ファイルを操作するために 必要な情報が入っている  変数に入れて使う C プログラミング入門 総機 1 ( 月 1) 8 ファイルを開く #include FILE *fopen(const char *filename, const char *mode ); fopen() のプロトタイプ モー ド 意味 "r" 読み込み (read) 。ファ イルがなければエラーと なる。 "w" 書き込み (write) 。既存 のファイルは削除される "a" 追記 (append) 。既存の ファイルがあればその末 尾に追記され、なければ 新規作成される。 構造体(今後の講義で解説)であるが、 内容を理解する必要は通常ない 構造体(今後の講義で解説)であるが、 内容を理解する必要は通常ない

ファイルが開けない場合がある  読み込みモードで、ファイルが存在しない場合  書き込みモードで、書き込み禁止の場所の場合  etc... 失敗した場合 NULL ポインタが返る C プログラミング入門 総機 1 ( 月 1) 9 ファイルオープンの失敗 { FILE *fp; fp = fopen("some.file", "w"); if(fp == NULL) { // エラー処理を行う

ファイルに書き込むための関数を利用  fprintf() は printf() と同じ使い方だが、第 1 引数にファイルポインタを与える C プログラミング入門 総機 1 ( 月 1) 10 ファイルに文字列を書きだす #include int fprintf(FILE *stream, const char *format,...); fprintf() のプロトタイプ 関数内容 fwrite ポインタで指すメモリ領域を指定したサイズだけ読み取って、 ファイルに書き込む fputc (putc) 1 バイトだけファイルに書き込む fputs 文字列をファイルに書き込む fflush バッファの中身をすべて書きだす その他のファイル書き込み関数

ファイルポインタを引数に fclose() を呼ぶ ファイルの書き込みは、効率のためにバッ ファリングがされるが、 fclose() は自動的に fflush() を呼び出す C プログラミング入門 総機 1 ( 月 1) 11 ファイルを閉じる #include int fclose(FILE *fp); fclose() のプロトタイプ

特定のパターンならループを使ってファイル を書きだせば書けそう 複雑な場合は? C プログラミング入門 総機 1 ( 月 1) 12 大きい画像を作る { FILE *fp; int i; fp = fopen("grad.pgm", "w");... for(i = 0; i < 4; ++i) { fprintf(fp, "%d %d %d %d\n", i*50, i*50, i*50, i*50); } 画素値 0, 50, 100, 150 の グラデーション

配列の各要素を画素値だと思って、そこに絵 を書く ループを使ってファイルに書き出す C プログラミング入門 総機 1 ( 月 1) 13 配列をキャンバスに使う unsigned char image[32][32] 画素値の配列を作って、 絵を書く 画素値の配列を作って、 絵を書く

C プログラミング入門 総機 1 ( 月 1) 14 コード例 { FILE *fp; int x, y; unsigned char image[32][32] = {{0}}; // image に絵を書く... // ファイル出力 fp = fopen("image.pgm", "w"); // エラーチェックをしてヘッダを書きだす... for(y = 0: y < 32; ++y) for(x = 0; x < 32; ++x) { fprintf(fp, "%d ", image[y][x]); } fclose(fp);... 32×32 ピクセルの配列をつ くり、ゼロで初期化する。 配列 image に画素値をい ろいろ入れる 空白でそれぞれの画素値が 区切られるようにする 行、列の順番で考えている

1 バイト (unsigned char) の配列をそのまま ファイルに書いた形式。ヘッダは P5 fwrite() を使って書きだす C プログラミング入門 総機 1 ( 月 1) 15 PGM のバイナリ形式の場合 unsigned char image[32][32] #include size_t fwrite(const void *buf, size_t size, size_t count, FILE *fp); fwrite() のプロトタイプ buf の指す場所から、 size [bytes] * count [ 個 ] の領域の値を fp の指すファ イルに書き出す

配列に様々な絵を書きこむ関数を実現するに は、配列へのポインタとサイズを渡す  配列のサイズを関数は直接知ることができない C プログラミング入門 総機 1 ( 月 1) 16 配列に絵を書く関数 // width x height の画像 img を color で塗りつぶす void fill(unsigned char *img, int width, int height, int color) { int x, y; for(y = 0; y < height; ++y) { for(x = 0; x < width; ++x) { // NG: img[y][x] = color; img[x + y*width] = color; } ポインタ引数で配列の先頭 位置を知っただけなので、 2次元配列としてアクセス できない。代わりに、座標 からメモリ上の位置を計算 する width x height の領域の先 頭へのポインタ

ファイル名などをプログラムで生成  自動的に日付を付ける  連番にする  etc... printf() は標準出力 ( 画面 ) に文字列を出す fprintf() はファイルに文字列を出す 文字配列に出力するには、 sprintf() を使う C プログラミング入門 総機 1 ( 月 1) 17 配列に文字列を書きこむ #include int sprintf(char *buffer, const char *format,...); sprintf() のプロトタイプ メモリ領域の先頭へのポインタ

sprintf() が書きだすのに十分大きい配列を 用意しておく  はみ出してもエラーは出ない  他の使われている領域を破壊する可能性がある C プログラミング入門 総機 1 ( 月 1) 18 sprintf() の使い方 char filename[10] '\0' { char filename[10] = ""; sprintf(filename, "img-%d.pgm", 5); 'i' 'm''g''-' '5''.' 'p''g''m' '\0' この例ではぎりぎりの文字 数となる。 5 の代わりに 10 としたら、はみ出してメ モリ破壊をしてしまう。 たとえば、ここが変数とな り、ループなどで変化する 実用上は 256 など、大きい 値を指定する

printf => 標準出力 ( 画面 ) fprintf => ファイル sprintf => メモリ ( 配列 ) ( 実は、 printf は stdout ファイルを指定した fprintf と同じ ) C プログラミング入門 総機 1 ( 月 1) 19 まとめ

手順  fopen() のモードを "r" で開く  fgetc(), fgets() で文字列を読み込み、メモリに書 きこむ  fscanf() によって文字列を数値などに変換してメ モリに書きこむ その後、 sscanf() によって処理をしてもよい 読み込みの処理は、書きこむよりも難しいこ とが多い  ファイルに「正しい」情報があるとは限らない C プログラミング入門 総機 1 ( 月 1) 20 テキストファイルの読み込み