10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと

Slides:



Advertisements
Similar presentations
プログラミング演習Ⅱ 課題 4 第 2 週 画像ファイル (ppm) の読み書き 画像データ用のメモリ確保・解放 1.
Advertisements

プログラミング演習 II 2005 年 1 月 19 日(第 9 回) 理学部数学科・木村巌. 前回までの復習 共用体( union type ) 共用体( union type ) 列挙 (enumerated type ) 列挙 (enumerated type ) 構造体、構造体のポインタ、
10: ファイル入出力 Linux にログインし、以下の講義ページ を開いておくこと teachers/w483692/CPR1/ C プログラミング入門 総機 1 ( 月 1) 1.
1 全体の流れ 画像ファイルを開き,画像データをメモリ上にロード メモリ上にロードした画像データに処理を加える 処理後のデータを出力ファイルに書き出す 画像データ用に確保したメモリを解放.
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
情報処理演習 (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回
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
ファイル操作と文字列の利用.
画像ファイル(ppm)の読み書き 画像データ用のメモリ確保・解放
2014/05/02 知的画像処理研究室 M1 中津美冴 画像情報処理1 ~画像処理プログラミング~ 2014/05/02 知的画像処理研究室 M1 中津美冴
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言語.
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
09: ポインタ・文字列 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
プログラミング基礎a 第7回 C言語によるプログラミング入門 ファイル入出力
プログラミング基礎B 文字列の扱い.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
第4回 ファイル入出力方法.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
11: 動的メモリ確保 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
プログラミング演習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回) 理学部数学科・木村巌.
コンピュータープログラミング (C言語)(10) 1.ファイル入出力
プログラミング入門2 第5回 配列 変数宣言、初期化について
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
Presentation transcript:

10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/CPR1/ 2014-06-16

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

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

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

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

例題: PGM ファイルの出力 fopen(), fprintf(), fclose() などは stdio.h で宣言されている #include <stdio.h> 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, " 0 127 255 255\n"); ... fclose(fp); 開いたファイルを識別するため情報を指すポインタ ファイルポインタと呼ばれる。変数名は何でもよい ファイルを mini.pgm という名前で、書きこみモードで開く ファイルに文字列を書きこむ ファイル閉じる 2014-06-16 C プログラミング入門 基幹2 (月4)

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

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

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

ファイルポインタを引数に fclose() を呼ぶ ファイルを閉じる ファイルポインタを引数に fclose() を呼ぶ ファイルの書き込みは、効率のためにバッファリングがされるが、 fclose() は自動的に fflush() を呼び出す fclose() のプロトタイプ #include <stdio.h> int fclose(FILE *fp); 2014-06-16 C プログラミング入門 基幹2 (月4)

特定のパターンならループを使ってファイルを書きだせば書けそう 複雑な場合は? 大きい画像を作る 特定のパターンならループを使ってファイルを書きだせば書けそう 複雑な場合は? 画素値 0, 50, 100, 150 のグラデーション { 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); } 2014-06-16 C プログラミング入門 基幹2 (月4)

配列の各要素を画素値だと思って、そこに絵を書く ループを使ってファイルに書き出す 配列をキャンバスに使う 配列の各要素を画素値だと思って、そこに絵を書く ループを使ってファイルに書き出す unsigned char image[32][32] 画素値の配列を作って、 絵を書く 255 255 21 2014-06-16 C プログラミング入門 基幹2 (月4)

コード例 { FILE *fp; int x, y; unsigned char image[32][32] = {{0}}; // ファイル出力 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 に画素値をいろいろ入れる 空白でそれぞれの画素値が区切られるようにする 行、列の順番で考えている 2014-06-16 C プログラミング入門 基幹2 (月4)

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

配列に様々な絵を書きこむ関数を実現するには、配列へのポインタとサイズを渡す 配列に絵を書く関数 配列に様々な絵を書きこむ関数を実現するには、配列へのポインタとサイズを渡す 配列のサイズを関数は直接知ることができない // 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; } width x height の領域の先頭へのポインタ ポインタ引数で配列の先頭位置を知っただけなので、2次元配列としてアクセスできない。代わりに、座標からメモリ上の位置を計算する 2014-06-16 C プログラミング入門 基幹2 (月4)

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

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

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