ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し

Slides:



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

10: ファイル入出力 Linux にログインし、以下の講義ページ を開いておくこと teachers/w483692/CPR1/ C プログラミング入門 総機 1 ( 月 1) 1.
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
情報処理演習C2 ファイル操作について (2).
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
構造体(struct) 配列では、複数のデータをひとまとまりにして操作する ことが出来る。しかし、それぞれのデータは同じ型(例えば
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
第13回 プログラミングⅡ 第13回
記憶クラス 変数をどのような記憶領域に割り当てるかを指定するのが記憶クラス 記憶クラスには、自動変数、静的変数、外部変数などがある。
構造体.
情報処理Ⅱ 第13回 2006年1月20日(金).
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
関数 関数とスタック.
情報処理Ⅱ 第13回 2004年01月25日(火).
構造体 構造体, 構造体とポインタの組み合わせ,.
10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
第2回 Microsoft Visual Studio C++ を使ってみよう
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
Cプログラミング演習 中間まとめ2.
Cプログラミング演習 第6回 ファイル処理と配列.
プログラミング 2 ファイル処理.
プログラミング論 ファイル入出力
プログラミング入門2 ファイルの入出力 ポインタ 芝浦工業大学情報工学科 青木 義満
Cプログラミング演習.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
Cプログラミング演習 第7回 メモリ内でのデータの配置.
プログラミング演習I 2003年6月25日(第10回) 木村巌.
知能情報工学演習I 第9回( C言語第3回) 課題の回答
プログラミング論 ファイル処理 (中級編)
プログラミング入門2 第11回 情報工学科 篠埜 功.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
知能情報工学演習I 第9回(後半第3回) 課題の回答
プログラミング論 ファイル入出力
Cの実行モデル.
プログラミング入門 第12回 情報工学科 篠埜 功.
プログラミング入門 第12回 情報工学科 篠埜 功.
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
プログラミング基礎B 文字列の扱い.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
2分法のプログラム作成方法 2分法のプログラム(全体構成) プログラム作成要領 2分法のメイン関数(変数宣言)
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
整数データと浮動小数データ.
第4回 ファイル入出力方法.
疑似乱数, モンテカルロ法によるシミュレーション
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
プログラミング演習I 2003年7月2日(第11回) 木村巌.
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
高度プログラミング演習 (11).
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
プログラミング入門 第12回 情報工学科 篠埜 功.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
ファイル操作について (1).
cp-3. 計算 (C プログラミング演習,Visual Studio 2019 対応)
モジュール分割.
Cp-1. Microsoft Visual Studio 2019 C++ の使い方 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
C言語プログラミング・課題 ファイルを読み込んで、その内容を表示するプログラムを作成せよ。
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
コンピュータープログラミング (C言語)(10) 1.ファイル入出力
printf・scanf・変数・四則演算
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
第2章 数値の入力と変数 scanfと変数をやります.
知能情報工学演習I 第9回(後半第3回) 課題の回答
Presentation transcript:

ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し ファイル処理 ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し

本日の内容 例題1. 1行単位のファイル読み込み ファイルからの読み込み ファイルの終わり(EOF ともいう) 例題2.ファイルからのデータ読み込み ファイル中のデータの取り出し 例題3. 1行単位のファイル書き出し ファイルへの書き出し 例題4. 3行目を2回読み込む ファイルのランダムアクセス

ファイル読み込み プログラム ファイル ファイルの中身は書き換わらない

ファイル書き出し プログラム ファイル ファイルの中身が書き換わる ファイルは伸び縮みすることがある

今日の到達目標 ファイルの読み書きを行うような、簡単なプログラムを書けるようになる ファイルを扱う手順(オープン,読み込み,書き出し,クローズ)を理解する

例題1.1行単位のファイル読み込み ファイルを読み込んで,ファイルの中身に行番号を付けて表示するプログラムを作る. ファイルの読み込みでは,1行単位の読み込みを行うために fgets 関数を使う ファイルのオープンを行うために fopen 関数を使い,ファイルのクローズを行うために fclose 関数を使う

#include <stdio.h> #pragma warning(disable:4996) int main() { char line[100]; int i = 1; FILE *in_file; in_file = fopen("d:\\input.txt", "r"); if ( in_file == NULL ) { printf( "fopen() error" ); return 0; } while( fgets( line, 100, in_file ) != NULL ) { printf( "[%d]%s", i, line ); i++; fclose(in_file); ファイルポインタ変数の宣言 ファイルのオープン (ファイルポインタが得られる) ファイルのオープンに 失敗したかを調べている ファイルの終わりに達し ていないかを調べている ファイルの 1行読み込み ファイルのクローズ (ファイルポインタを使ってクローズする)

実行結果例 [1]アレンジメントの特質 [2]・空間を分割 [3]・分割された部分(フェイス)は,凸性を有する(従って有界)か, [4] 非有界な半空間 [5]・ボロノイ図を容易に導ける [6]・単体に容易に分解できる

プログラムとデータ メモリ ① line[0] line[1] ファイルの 1行読み込み line[2] line[3] line[4] ② fgets( line, 100, in_file ) line[1] ファイルの 1行読み込み line[2] line[3] line[4] ② printf( "[%d]%s", i, line ); 1行分の表示

プログラム実行順 in_file = fopen("d:\\input.txt", "r"); Yes fgets( line, 100, in_file ) != NULL No printf( "[%d]%s", i, line ); i++; fclose(in_file);

ファイルのオープンとクローズ ファイルのオープン ファイルのクローズ ファイルの読み書きを行う前に、ファイルはオープンされねばらならい ファイルの読み書きが終わったら,ファイルはクローズされねばならない

ファイルポインタ ファイルポインタ変数の宣言 ファイルのオープン ファイルのクローズ fclose(in_file);    例)FILE *in_file; 「in_file」という名前の付いたファイルポインタ変数を宣言 ファイルのオープン    例)in_file = fopen("d:\\input.txt", "r");   ファイルのオープンを行うと,ファイルポインタが得られる ファイルのクローズ    fclose(in_file);   ファイルポインタを使って,ファイルのクローズを行う オープンモード r : 読み込みの意味 w: 書き出しの意味 オープンすべき ファイル名

ファイルポインタ変数の働き ・現在のファイルのファイル位置指示子  (ファイルの読み書き位置) ・ファイルのオープンモード など

fgets の意味 ファイル 文字の配列 M a r k \n \0 ファイルの1行読み込み ファイルの一行分を読み込んで,末端の\0を付ける ファイルには,行の終わりに,改行記号(\n)が付いている(目には見えない) 読み込み先(文字の配列)のサイズが,ファイルの1行の長さより長いときは,「残りの部分」は変化しない ファイル Mark\n 変化しない部分 文字の配列 M a r k \n \0 改行記号 文字列の末端

配列のサイズが100ならば,読み込める文字は99まで fgets で「100」を書く理由 fgets( line, 100, in_file ) 読み込み先の 配列の変数名 読み込み先の 配列のサイズ ファイルポインタ 変数名 ファイル 文字の配列 \0 文字列の末端 配列のサイズが100ならば,読み込める文字は99まで (最後に必ず「\0」が付く)

NULLの意味 fopen 関数では「ファイルオープンの失敗」 例) fopen(“d:\\input.txt", "r") if ( in_file == NULL ) { fgets 関数では「ファイルの終わり」 例) fgets( line, 100, in_file ) != NULL

例題2.ファイルからのデータ読み込み 次のような名簿ファイルを読み込んで,1列目の氏名と,3列目の住所だけを表示するプログラムを作る 各データは,空白文字で区切られる. 1列目の氏名と,3列目の住所を取り出すために sscanf 関数を使う 金子邦彦 1200/01/01 福岡市東区箱崎 092-642-4068 ○○×× 1300/12/31 福岡市東区貝塚 092-642-3883 ●●■■ 800/05/31 福岡市東区香椎 092-642-3884

#include <stdio.h> #pragma warning(disable:4996) int main() { char line[100]; char name[100]; char birth[100]; char address[100]; FILE *in_file; in_file = fopen("a=d:\\Book1.csv", "r"); if ( in_file == NULL ) { printf( "fopen() error" ); return 0; } while( fgets( line, 100, in_file ) != NULL ) { sscanf_s( line, "%s %s %s", name, birth, address ); printf( "name=%s, address=%s\n", name, address ); fclose(in_file); ファイルポインタ変数の宣言 ファイルのオープン (ファイルポインタが得られる) ファイルのオープンに 失敗したかを調べている ファイルの 1行読み込み ファイルの終わりに達し ていないかを調べている 1列目,2列目,3列目の取り出し ファイルのクローズ (ファイルポインタを使ってクローズする)

実行結果例 name=金子邦彦, address=福岡市東区箱崎 name=○○××, address=福岡市東区貝塚

プログラムとデータ メモリ ① ファイルの 1行読み込み ② データの取り出し ③ 1行分の表示 line[0] line[1] fgets( line, 100, in_file ) ファイルの 1行読み込み line[99] ② sscanf( line, "%s %s %s", name, birth, address ); データの取り出し name birth address ③ printf( "name=%s, ... 1行分の表示

プログラム実行順 in_file = fopen("d:\\Book1.csv", "r"); Yes No fgets( line, 100, in_file ) != NULL sscanf( line, "%s %s %s", name, birth, address ); No printf( "name=%s, address=%s\n", name, address ); fclose(in_file);

sscanf 関数 sscanf( line, "%s %s %s", name, birth, address ); に格納する ○○×× 1300/12/31 福岡市東区貝塚 092-642-3883 1行分 1列目 2列目 3列目 4列目

例題3.1行単位のファイル書き出し 2つの浮動小数データを読み込んで,sin 関数を使った計算を行い,計算結果をファイルに書き出すプログラムを作る. 「0」と「0.1」を読み込むと,0, 0.1, … 1.9 について,sin関数を使った計算を繰り返す(繰り返し回数は20回とする) ファイルの書き出すでは,1行単位の書き出しを行うために fprintf 関数を使う 書き出されたファイルは,Microsoft Excel で読み込み可能な形式であること

start_x と step_x を キーボードから読み込む関数 #include <stdio.h> #include <math.h> struct compute { double start_x; double step_x; }; void input_data( struct compute *data ) { printf( "start_x =" ); scanf( "%lf", &(data->start_x) ); printf( "step_x =" ); scanf( "%lf", &(data->step_x) ); } start_x と step_x を キーボードから読み込む関数

start_x と step_x を使って計算 を行い,結果をファイルに書き込む関数 void output_result( struct compute *data, char *file_name ) { double x; double y; int i; FILE* fp; fp = fopen( file_name, "w" ); for( i = 0; i < 20; i++ ) { x = data->start_x + ( i * data->step_x ); y = sin( x ); printf( "x= %lf, y= %lf\n", x, y ); fprintf( fp, "x=, %lf, y=, %lf\n", x, y ); } fclose( fp );

int main() { struct compute data; input_data( &data ); output_result( &data, "z:\\data.csv" ); return 0; }

関数呼び出しの流れ input_data 関数 main 関数 int main() return; output_result 関数 void input_data( struct compute *data ) main 関数 int main() 関数呼び出し 戻り input_data(&data); return; 関数呼び出し output_result 関数 void output_result( struct compute *data, char *file_name ) output_result(&data,"z:\\data.csv"); 戻り return;

1行単位のファイル読み込み の手順 ファイルのオープン fprintf 等を使って, ファイルの1行書き出し No Yes 終わりか? No Yes ファイルのクローズ

テキストファイルの読み書き 読み込み 書き出し fgets と sscanf を使って,1行単位で読み込み fprintf を使って,1行単位で書き出し

オープンモード fopen( file_name, "w" ); “r” モード “w” モード ファイル名 オープンモード (文字列) 読み込みモード 引数fileで指定したファイルが存在しないか,読み込み不可能な場合には,オープンすることができない. “w” モード 書き出しモード 引数fileで指定したファイルが存在しない場合には,ファイルが新たに作成される.ファイルがすでに存在した場合,ファイル中のデータはすべて捨てられる(ファイルの長さは0になる).

課題3.ファイルのコピー ファイルをコピーするプログラムを作りなさい ファイルを1行単位で読み込んで,別のファイルに1行単位で書き出すことを繰り返す. ファイルの読み込みでは,1行単位の読み込みを行うために fgets 関数を使う ファイルの書き出しでは,1行単位での書き出しを行うために fprintf関数を使う 2つのファイルを扱うために,2つのファイルポインタ変数の宣言を行うこと 読み込むべきファイルは,Zドライブに事前に作成しておくこと