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

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

ファイル入出力

ファイル入出力

演算増幅器

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

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

情報処理演習 B8クラス

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

プログラミング基礎

Microsoft PowerPoint - prog04.ppt

gengo1-12

PowerPoint Presentation

gengo1-12

計算機プログラミング

gengo1-12

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

2006年10月5日(木)実施

PowerPoint プレゼンテーション

Prog1_12th

データ構造

Microsoft PowerPoint - kougi6.ppt

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

スライド タイトルなし

slide4.pptx

02: 変数と標準入出力

02: 変数と標準入出力

PowerPoint Presentation

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

Microsoft PowerPoint pptx

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

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

PowerPoint プレゼンテーション

練習&演習問題

※ ポイント ※

PowerPoint プレゼンテーション

Microsoft PowerPoint - lec10.ppt

ディジタル信号処理

卒 業 研 究 報 告.PDF

memo

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

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

Microsoft PowerPoint - kougi2.ppt

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

データ構造

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

ディジタル信号処理

Microsoft PowerPoint - kougi4.ppt

Microsoft PowerPoint - kougi8.ppt

V

Microsoft Word - no204.docx

Microsoft Word - no15.docx

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

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

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

ポインタ変数

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

memo

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

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

Prog1_15th

目次

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

Prog1_10th

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

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

ポインタ変数

Microsoft PowerPoint - prog06.ppt

Taro-リストⅢ(公開版).jtd

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 - guidance.ppt

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

Microsoft Word - 06

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

slide5.pptx

Microsoft Word - no11.docx

ファイルシステム

memo

Microsoft PowerPoint - 10Com2.ppt

PowerPoint プレゼンテーション

C言語入門

Microsoft PowerPoint - 11.pptx

Microsoft PowerPoint - 計算機言語 第7回.ppt

データ構造

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

Microsoft Word - cpro_m_13.doc

Taro-リストⅠ(公開版).jtd

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

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

Microsoft PowerPoint - OOP.pptx

Taro-ポインタ変数Ⅰ(公開版).j

Microsoft PowerPoint - kougi11.ppt

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

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

memo

PowerPoint プレゼンテーション

Microsoft PowerPoint - kougi9.ppt

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

gengo1-8

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

Transcription:

第 9 回 (6/18) 3. ファイルとその応用 外部記憶装置に記録されたプログラムやデータを, ファイルと呼ぶ シーケンシャルファイルやランダムファイルへのデータの記録や読み出し, 更新の手順について学習する (1) ファイルとレコードファイル複数の関連したデータを一つに集めたり プログラムを外部記憶装置に保存したものレコードファイルを構成する一塊のデータ ex. 個人カードフィールドレコードを構成する個別の要素 ex. 氏名, 住所, 電話番号等 cf. ファイルという概念ディスクファイル, 画面, キーボード, ポート, テープ上のファイル等, 入出力機能を提供するデバイスはすべてファイル システム上のファイルである ストリームという概念プログラマとファイル ( 入出力デバイス ) の間にある論理的インタフェース ストリームは 開く操作 によってファイルに結び付けられ, 閉じる操作 によってファイルから切り離される ファイル処理にはどんな内容があるか 1ファイルの作成集められたデータをまとめて記録する 2レコードの取り出しファイル内の必要なレコードを取り出す 3レコードの更新ファイル内の特定レコードに変更を加え, 書き込む 4レコードの追加新しいデータを新しいレコードとして追加する 5レコードの削除不用になったレコードをファイルから削除する cf. 削除の方法 対象となるレコード内のデータの消去 対象となるレコードそのものの削除 削除を示すマークをつける

(2) ファイルのアクセス方法 シーケンシャルファイル データが領域の先頭から順番に記録されているファイルのこと これらのデータを取り出すには, 先頭から順番に取り出すことしかできない ex. 個人カード ( レコード ) が可変長で記録されているファイル シーケンシャルファイルの処理手順 1ファイル ポインタの宣言 2ファイルのオープン 3ファイル処理 4ファイルのクローズ 1ファイル ポインタを宣言する FILE * ファイル ポインタ ex. FILE *fp; 注 )stdio.h の中で, 一般的なファイルの入出力のために FILE 型という構造体が定義されている FILE 型は, サイズ, ファイルの現在位置, 読み書きのどちらをされるのかといったアクセスモード, エラーあるいはファイル終端 (EOF) が起きたのかといった, ファイルに関するさまざまな情報を格納している fp は FILE に対するポインタであり, ファイルを開くための fopen 関数は FILE 型へのポインタを返すことを意味している 2ファイルをオープンする ファイル ポインタ = fopen(" ファイル名 ", " モード "); ex. fp = fopen("name.txt", "w");

ファイルオープン時のモード モード 内容 注意 r 読み込みモード ファイルがないとエラーとなる w 書き込みモード すでに同名のファイルがあれば重ね書きする なければ, 新たにファイルをつくる a 追加モード すでに同名のファイルがあれば, 最後に追加する なければ, 新たにファイルをつくる モードのあとに b を付けると, バイナリファイルが対象となる モードのあとに+を付けると, 読み書き可能となる 3 必要なファイル処理を行う 基本的なファイル処理は, ファイルからの読み込み, ファイルへの書き込みである ファイル入出力関数 内容 内容 (1) fgetc( ファイル ポインタ ) ファイルからの 1 文字読み込み (2) fgets( 配列名, 最大文字数, ファイル ポイ ファイルからの 1 行読み込み ンタ ) (3) fscanf( ファイル ポインタ, " 入力フォーマット ", 引数...) ファイルからのフォーマット付き入力 (4) fputc( 文字, ファイル ポインタ ) ファイルへの 1 文字書き込み (5) fputs( 配列名, ファイル ポインタ ) ファイルへの 1 行書き込み (6) fprintf( ファイル ポインタ, " 出力フォーマット ", 引数...) ファイルへのフォーマット付き出力 例 (1) int c; 例 (4) int c; c = fgetc(fp1); fputc(c, fp1); 例 (2) char a[10]; 例 (5) char a[10]; fgets(a, sizeof a, fp1); fputs(a, fp1); 例 (3) int i, j; 例 (6) int i, j; fscanf(fp1, "%d %d", &i, &j); fprintf(fp1, "%d %d", i, j);

4ファイルをクローズする fclose( ファイル ポインタ ); ex. flose(fp); 例題 3-3 出力結果 3-3のように, 生徒の氏名をキーボードから入力し, ファイルに書き込むプログラムをつくりなさい 入力終了は,Ctrl-d としなさい 出力結果 3-3 データを入力してください 終了は, Ctrl-d Kyoko Ishida Ichiro Suzuki Yoshiko Tanaka Makoto Sasaki Yoko Kobayashi Ctrl-d 考え方ファイル ポインタを fp1, ファイル名を name.txt とし,fopen 関数においてモードを "w" とすることに注意する 文字列の入力には書式を指定して scanf 関数を用いる 注 ) ファイルのオープンに失敗したときのエラー処理 C 言語では指定したファイルがなくてもエラーメッセージを出さない そのため, プログラムでチェックする必要がある 以下に例を示す if ((fp1 = fopen("name.txt", "w")) == NULL) { printf(" ファイルがオープンできませんでした \n"); exit(1); }

ここでは,fopen 関数はファイルがオープンできなかった場合に NULL を返すことを利用してエラー処理を行っている exit(1) はそのときの処理を終了する関数であり,stdlib.h に収録されている このため, プログラム先頭で #include <stdlib.h> と記述する必要がある 関数 exit() について 関数 exit() は,C 言語でプログラムの実行を強制終了するときに呼び出す この関数は stdlib.h で次のように宣言されている void exit(int status); int 型引数の status の値は, 慣習的には,0 という値が返されればすべて正常であり,0 以外の値が返されれば何らかの異常な状態が起こったことを示す

プログラム 3-3 01 /* E3-3 */ 02 /* シーケンシャルファイルへのデータの記録 */ 03 #include <stdio.h> 04 #include <stdlib.h> 05 06 main() 07 { 08 FILE *fp1; 09 char last_name[15], first_name[15]; 10 11 if ((fp1 = fopen("name.txt", "w")) == NULL) { 12 printf(" ファイルがオープンできません \n"); 13 exit(1); 14 } 15 printf(" データを入力してください 終了は, Ctrl-d\n"); 16 while (scanf("%s%s", first_name, last_name)!= EOF) { 17 fprintf(fp1, "%s %s", first_name, last_name); 18 fputc('\n', fp1); 19 } 20 fclose(fp1); 21 }

練習問題 27 1.1 から 10 までの数を,fprintf 関数を用いてファイル number.txt に書き込むプログラムをつくりなさい 但し, 各数字のあとに改行 '\n' を挿入すること 2. 例題 3-3で作成したファイル name.txt に自分の名前を追加するプログラムをつくりなさい ヒント ファイルの最後にデータを追加する場合には,fopen 関数によってファイルをオープンするときにモードを "a" にすればよい

例題 3-4 例題 3-3で作成したファイル name.txt を読み込んで, 画面に表示するプログラムをつくりなさい 出力結果 3-4 データを画面に表示します Kyoko Ishida Ichiro Suzuki Yoshiko Tanaka Makoto Sasaki Yoko Kobayashi 考え方ファイル名を name.txt とし,fopen 関数においてモードを "r" とすることに注意する

プログラム 3-4 01 /* E3-4 */ 02 /* シーケンシャルファイルからのデータの読み出し */ 03 #include <stdio.h> 04 #include <stdlib.h> 05 06 main() 07 { 08 FILE *fp1; 09 char last_name[15], first_name[15]; 10 11 if ((fp1 = fopen("name.txt", "r")) == NULL) { 12 printf(" ファイルがオープンできません \n"); 13 exit(1); 14 } 15 16 printf(" データを画面に表示します \n"); 17 while (fscanf(fp1, "%s%s", first_name, last_name)!= EOF) 18 printf("%s %s\n", first_name, last_name); 19 fclose(fp1); 20 } 練習問題 27 3. 練習問題 27-1で作成したファイル number.txt を読み込んで, 画面に表示するプログラムを fscanf 関数を用いてつくりなさい

ランダムファイル ファイルのサイズに関係なく, ファイルを構成するすべてのレコードが同じ容量であり, ファイルの途中にあるデータを直接読み書きできるファイルのこと データの中で容量が最も大きいデータが書き込めるように, レコードの容量を決定する必要がある あとから, レコードの容量を変更することはできない ex. 個人カード ( レコード ) が固定長で記録されているファイル ランダムファイルの処理手順基本的にはシーケンシャルファイルと同様 但し, ランダムファイル処理を行うには, ファイルの中のデータの位置を指定する必要がある C 言語では,fseek 関数を利用してランダム処理ができる fseek 関数の書式は次の通り fseek( ファイル ポインタ, 移動量, 移動原点 ); 移動量 : 移動量は long 型である 移動原点 :SEEK_SET 先頭から SEEK_CUR 現在の位置から SEEK_END 最後から

例題 3-5 出力結果 3-5のように, 生徒の氏名をキーボードから入力し,1 レコード 30 バイト ( 姓に 15 バイト, 名に 15 バイト ) のランダムファイルに書き込むプログラムをつくりなさい 出力結果 3-5 データを入力してください 終了は, Ctrl-d Kyoko Ishida Ichiro Suzuki Yoshiko Tanaka Makoto Sasaki Yoko Kobayashi Ctrl-d 考え方ファイル ポインタを fp1, ファイル名を name2.txt とし,fopen 関数においてモードを "w" とする また, データ読み込みは scanf 関数, 書き込みの際は位置指定に fseek 関数, データ書き込みには書式を指定する fprintf 関数を用いる

プログラム 3-5 01 /* E3-5 */ 02 /* ランダムファイルへのデータの記録 */ 03 #include <stdio.h> 04 #include <stdlib.h> 05 06 main() 07 { 08 FILE *fp1; 09 char first_name[15], last_name[15]; 10 int i = 0; 11 12 if ((fp1 = fopen("name2.txt", "w")) == NULL){ 13 printf(" ファイルがオープンできません \n"); 14 exit(1); 15 } 16 17 printf(" データを入力して下さい 最後は,Ctrl-d\n"); 18 while (scanf("%s%s", first_name, last_name)!= EOF) { 19 fseek(fp1, i * 30L, SEEK_SET); 20 fprintf(fp1, "%15s%15s", first_name, last_name); 21 i++; 22 } 23 fclose(fp1); 24 }

例題 3-6 例題 3-5において作成したデータファイル name2.txt の先頭から任意の位置のデータを表示するプログラムをつくりなさい 出力結果 3-6 最初から何番目のデータを表示しますか (0 で終了 )? 3 データは Yoshiko Tanaka です 最初から何番目のデータを表示しますか (0 で終了 )? 1 データは Kyoko Ishida です 最初から何番目のデータを表示しますか (0 で終了 )? 0 考え方ファイル ポインタを fseek 関数によって読み込みたい場所へ移動し,fscanf 関数によって読み込む

プログラム 3-6 01 /* E3-6 */ 02 /* ランダムファイルからのデータの読み出し */ 03 #include <stdio.h> 04 #include <stdlib.h> 05 06 main() 07 { 08 FILE *fp1; 09 char last_name[15], first_name[15]; 10 int i = 0; 11 12 if ((fp1 = fopen("name2.txt", "r")) == NULL) { 13 printf(" ファイルがオープンできません \n"); 14 exit(1); 15 } 16 while (1) { 17 printf(" 最初から何番目のデータを表示しますか (0 で終了 )? "); 18 scanf("%d", &i); 19 if (i == 0) break; 20 fseek(fp1, (i-1) * 30L, SEEK_SET); 21 fscanf(fp1, "%s%s", first_name, last_name); 22 printf(" データは %s %s です \n\n", first_name, last_name); 23 } 24 fclose(fp1); 25 }

練習問題 28 1. 下記のような電話帳がある これをランダムファイル name_tel.txt に書き込むプログラムをつくりなさい Ichiro Suzuki 03-1111-2222 Hanako Yamato 042-387-5555 ヒント 1 人毎のデータを下記のような単位 ( レコード ) で記録する 名と姓, 電話番号の 2 項目についてそれぞれ scanf 関数を用いて入力する また, データ入力の終了は Ctrl-d とする データの書き込みは 1 人毎のデータをまとめて書式指定して,fprintf 関数を用いて行う 名 15 バイト姓 15 バイト電話番号 15 バイト 出力例 名前を入力して下さい 終了は,Ctrl-d Ichiro Suzuki 電話番号を入力して下さい 03-1111-2222 名前を入力して下さい 終了は,Ctrl-d Ctrl-d

2. 例題 3-5において作成したデータファイル name2.txt の最後から 4 番目のデータと, その二つ後のデータを表示するプログラムをつくりなさい ヒント name2.txt からのデータ読み出しは,fseek 関数で位置を指定してから,fscanf 関数を用いる fseek 関数での移動原点の指定には,SEEK_END と SEEK_CUR を用いる 出力例 最後から 4 番目のデータは Ichiro Suzuki です 二つ後のデータは Makoto Sasaki です 3. 練習問題 28-1で作成したファイル name_tel.txt の先頭から任意の位置のデータを表示するプログラムをつくりなさい ヒント データ読み出しは, 書き込みと同じ書式を指定して fscanf 関数を用いる 出力例 最初から何番目のデータを表示しますか (0 で終了 )? 1 Ichiro Suzuki 03-1111-2222 最初から何番目のデータを表示しますか (0 で終了 )? 0