02: 変数と標準入出力

Similar documents
02: 変数と標準入出力

ファイル入出力

ファイル入出力

演算増幅器

計算機プログラミング

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

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

02: 変数と標準入出力

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

PowerPoint プレゼンテーション

02: 変数と標準入出力

gengo1-12

gengo1-12

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

Prog1_12th

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

gengo1-12

情報処理演習 B8クラス

Microsoft PowerPoint - kougi6.ppt

02: 変数と標準入出力

Microsoft PowerPoint - prog04.ppt

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

slide4.pptx

2006年10月5日(木)実施

PowerPoint Presentation

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

プログラミング基礎

Microsoft Word - no15.docx

02: 変数と標準入出力

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

memo

スライド タイトルなし

02: 変数と標準入出力

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

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

02: 変数と標準入出力

※ ポイント ※

Microsoft PowerPoint - prog06.ppt

Microsoft Word - no204.docx

Microsoft PowerPoint pptx

Microsoft PowerPoint - kougi8.ppt

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

PowerPoint Presentation

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

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

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

02: 変数と標準入出力

Microsoft Word - 06

Microsoft PowerPoint - kougi9.ppt

PowerPoint プレゼンテーション

02: 変数と標準入出力

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

ファイル入出力と プロセス間通信 \(1\)

Prog1_10th

Microsoft PowerPoint - handout09.ppt

PowerPoint プレゼンテーション

02: 変数と標準入出力

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

目次

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

PowerPoint プレゼンテーション

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

memo

memo

Microsoft PowerPoint - kougi4.ppt

データ構造

C言語入門

Microsoft PowerPoint - handout08.ppt

練習&演習問題

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

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

02: 変数と標準入出力

02: 変数と標準入出力

Microsoft PowerPoint - kougi2.ppt

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

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

プログラミング実習I

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

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

Microsoft PowerPoint - guidance.ppt

memo

訋箊æ©�ã…Šã…�ㇰㅩã…�ㅳㇰ - 第13åłž ã…Łã‡¡ã‡¤ã…«å⁄¦ç’ƒ

Microsoft PowerPoint pptx

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

02: 変数と標準入出力

PowerPoint プレゼンテーション

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

ファイルシステム

V

Prog1_15th

C 言語講座 Vol 年 6 月 26 日 CISC

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

第1回 プログラミング演習3 センサーアプリケーション

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

PowerPoint Presentation

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

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

臨床画像技術学Ⅱ

Microsoft PowerPoint - kougi7.ppt

Transcription:

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

今日の内容 2 標準ライブラリ関数によりファイルの出力を行う画像ファイルの生成を例題として 配列の作成を復習する 文字列の扱いを復習する 関数を作ってプログラムを構造化する

テキストファイルの中を覗いてみる 3 文字コードの羅列でできているもの Dear all, I hope you and your family are fine.... Linux のコンソールで, od -ctx1 ファイル名 とすると 文字コードを表示できる コマンドの詳細は man od で見れる

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

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

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

例題 : PGM ファイルの出力 7 #include <stdio.h> int main(void) { FILE *fp; fopen(), fprintf(), fclose() などは stdio.h で宣言されている 開いたファイルを識別するため情報を指すポインタファイルポインタと呼ばれる 変数名は何でもよい 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 という名前で 書きこみモードで開く ファイルに文字列を書きこむ

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

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

NULL ポインタ 10 アドレスとしてどこも指さないことを示す特殊な値を持つポインタ ポインタ変数に 0 を与えると NULL ポインタとなる ただし アドレスが 0 というわけではない ポインタとみなすとき 特別扱いされるだけである NULL ポインタを表記するために NULL というマクロが <stdlib.h> で定義されている if(fp == NULL) { // エラー処理 どちらを使ってもよい if(fp == 0) { // エラー処理

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

ファイルを閉じる 12 ファイルポインタを引数に fclose() を呼ぶ ファイルの書き込みは 効率のためにバッファリングがされるが fclose() は自動的に fflush() を呼び出す fclose() のプロトタイプ #include <stdio.h> int fclose(file *fp);

大きい画像を作る 13 特定のパターンならループを使ってファイルを書きだせば書けそう 複雑な場合は? 画素値 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); }...

配列をキャンバスに使う 14 配列の各要素を画素値だと思って そこに絵を書く ループを使ってファイルに書き出す unsigned char image[32][32] 0 0 255 0 0 ただし 配列はそんなに大きいものが作れないので 場合によっては今後説明する動的メモリ確保が必要となる 0 0 255 0 0 0 0 0 0 0 0 0 21 0 0 画素値の配列を作って 絵を書く

コード例 15 { FILE *fp; int x, y; unsigned char image[32][32] = {{0}}; 32 32 ピクセルの配列をつくり ゼロで初期化する // 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);... 配列 image に画素値をいろいろ入れる 空白でそれぞれの画素値が区切られるようにする 行 列の順番で考えている

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

配列に絵を書く関数 17 配列に様々な絵を書きこむ関数を実現するには 配列へのポインタとサイズを渡す 配列のサイズを関数は直接知ることができない // 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 次元配列としてアクセスできない 代わりに 座標からメモリ上の位置を計算する

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

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

printf と stdout 20 printf は fprintf(stdout, "format string", ); と同じ ファイルポインタ stdout は標準出力といい <stdio.h> で定義されている 画面を一種のファイルとして扱っている

まとめ 21 printf => 標準出力 ( 画面 ) fprintf => ファイル sprintf => メモリ ( 配列 ) ( 実は printf は stdout ファイルを指定した fprintf と同じ )

テキストファイルの読み込み 22 手順 fopen() のモードを "r" で開く fgetc(), fgets() で文字列を読み込み メモリに書きこむ fscanf() によって文字列を数値などに変換してメモリに書きこむ その後 sscanf() によって処理をしてもよい 読み込みの処理は 書きこむよりも難しいことが多い ファイルに 正しい 情報があるとは限らない EOF の処理については省略