プログラミング入門2 ファイルの入出力 ポインタ 芝浦工業大学情報工学科 青木 義満

Slides:



Advertisements
Similar presentations
プログラミング入門2 芝浦工業大学情報工学科青木 義満 第11回構造体. プログラミング入門2 2 構造体 5 人分のサッカー選手データ 全てのデータを関数に渡して,処理する場合 char name[5][256]; int assist[5]; int score[5]; void func( char.
Advertisements

プログラミング入門2 芝浦工業大学情報工学科青木 義満 第6回関数(2). プログラミング入門2 2 今回の講義内容 関数 配列データの受け渡し ( p.130 ~) 入出力と文字 ( p.198 ~) 文字列の基本 ( p.208 ~)
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
プログラミング入門2 第1回 イントロダクション 芝浦工業大学情報工学科 青木 義満
応用理工学情報処理 第1回(2015年10月 5日) 月曜日担当 前島展也 Manaba
情報処理演習C2 ファイル操作について (2).
ポインタ プログラミング入門2 第10回 芝浦工業大学情報工学科 青木 義満
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第7回 文字列 数学関数 ファイルの入出力 芝浦工業大学情報工学科 青木 義満
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング入門2 ポインタについて補足 構造体 第11回 芝浦工業大学情報工学科 青木 義満、篠埜 功
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
プログラミング入門2 第6回 関数(2) 芝浦工業大学情報工学科 青木 義満
プログラミング演習(2組) 第12回
第13回 プログラミングⅡ 第13回
記憶クラス 変数をどのような記憶領域に割り当てるかを指定するのが記憶クラス 記憶クラスには、自動変数、静的変数、外部変数などがある。
第8回 プログラミングⅡ 第8回
プログラミング入門2 第12回 データ型 関数のプロトタイプ宣言 動的な記憶域確保 芝浦工業大学情報工学科 青木 義満
プログラミング入門2 第3回 繰り返し文 芝浦工業大学情報工学科 青木 義満
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
構造体 プログラミング入門2 芝浦工業大学情報工学科 青木 義満
10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
プログラミング入門2 第5回 関数(1) 芝浦工業大学情報工学科 青木 義満
プログラミング 2 ファイル処理.
プログラミング論 ファイル入出力
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
プログラミング 4 記憶の割り付け.
プログラミング入門2 第2回 演算と型 条件分岐 芝浦工業大学情報工学科 青木 義満
プログラミング演習I 2003年6月25日(第10回) 木村巌.
第10章 これはかなり大変な事項!! ~ポインタ~
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング入門2 第11回 情報工学科 篠埜 功.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
第13章 文字の取り扱い方 13.1 文字と文字型関数 13.2 文字列 13.3 文字型配列への文字列の代入
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
プログラミング論 ファイル入出力
第11回 プログラミングⅡ 第11回
プログラミング入門2 第12回 データ型 関数のプロトタイプ宣言 動的な記憶域確保 芝浦工業大学情報工学科 青木 義満
プログラミング基礎B 文字列の扱い.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
第4回 ファイル入出力方法.
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
Cプログラミング演習資料.
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング演習I 2003年7月2日(第11回) 木村巌.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
プログラミング 4 文字列.
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
コンピュータープログラミング (C言語)(10) 1.ファイル入出力
printf・scanf・変数・四則演算
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
第2章 数値の入力と変数 scanfと変数をやります.
知能情報工学演習I 第9回(後半第3回) 課題の回答
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

プログラミング入門2 ファイルの入出力 ポインタ 芝浦工業大学情報工学科 青木 義満 I’ll get started with Introduction and Conventional works around our study, then mention our motivation and goal. Next, I’ll explain our 3D Face Modeling Method and its medical application. Finally, I’ll conclude this presentation with some future works. 芝浦工業大学情報工学科 青木 義満

前回演習問題,課題についての注意事項 演算の優先順位について 配列の要素数について radian = acos(naiseki/p1*p2); naiseki = x1*x2 + y1*y2; p1 = sqrt(x1*x1+y1*y1); p2 = sqrt(x2*x2+y2*y2); radian = acos(naiseki/(p1*p2)); ()を使って計算の 優先順位を決める 配列の要素数に変数は使用できない。 定数のみ使用可能 (直接数字を書くか,#defineで定数を定義するか) 重要 int  num; char name[num][128]; printf(“人数を入力してください:”); scanf(“%d”, &num); ※必要なサイズの配列を動的に確保することも可能   alloc, malloc関数 コンパイルエラー プログラミング入門2

今回の講義内容 ファイル入出力 ファイルからのデータ読込み ファイルと配列 ポインタ ポインタの基本 プログラミング入門2

ファイルへのデータ書き込み(復習) ソースファイル名:fileio1.c データをファイルに書き込み ファイルポインタ宣言 100 morishima 95.5 #include <stdio.h> int main(void) { FILE *fp; int student_id = 100; char name[ ]= "morishima"; double tensu = 95.5; fp = fopen("test.txt","w"); fprintf( fp, "%d\n", student_id ); fprintf( fp, "%s\n", name ); fprintf( fp, "%f\n", tensu ); fprintf( fp, "%d %s %f\n", student_id, name, tensu ); fprintf( fp, "%d\t%s\t%f\n", student_id, name, tensu ); fclose(fp); return(0); } ファイルポインタ宣言 ファイルに書き込むデータ “test.txt”という名前でファイルをオープン (書き込み用) データをファイルに書き込み ファイルを閉じる プログラミング入門2

ファイルからのデータの読込みの必要性 ファイルに格納されているデータを,プログラム中に読み込んで処理 プログラム~xxx.c int student_id[NUMBER]; char name[NUMBER][256]; double score[NUMBER]; ・・・・・・・・・・・ ・・・・・・・・・・ プログラム~xxx.c ファイル~成績表リスト 1 aoki 80.5 100 morishima 95.5 tokunaga 70.4 ・・・・・・ ・・・・・ プログラミング入門2

データの作成(野球選手成績リスト) ソースファイル名:player1.c チーム名,選手名,ホームラン数をファイルに書き込み #include <stdio.h> #define NUM 100 /* 最大100人までの選手データを扱う */ int main(void) { FILE *fp; char team[NUM][256]; char name[NUM][256]; int hr[NUM]; int i; fp = fopen("player.txt","w"); /* キーボードから選手データを読込み */ for(i=0; i < 5; i++){ printf("Input Players' Data\n"); printf("Team : "); scanf("%s", team[i]); printf("name : "); scanf("%s", name[i]); printf("Homerun : "); scanf("%d", &hr[i]); }   for(i=0; i < 5; i++){       /* 読み込んだデータを画面表示 */       printf( "%s %s %d\n", team[i], name[i], hr[i]);       /* 読み込んだデータをファイルへ書き込み */       fprintf( fp, "%s %s %d\n", team[i], name[i], hr[i]);   }   fclose(fp);   return(0); } G Matsui 50 L Matsui 33 D Fukudome 20 ・・・・・・ ・・・・・ player.txt プログラミング入門2

ファイルからのデータの読み込み ファイルからデータを読み込む際の手順 ファイルを開く (読込みモードで) 変数へのデータの読込み ファイルを開く (読込みモードで) 変数へのデータの読込み fscanf関数等を使用 ファイルを閉じる プログラミング入門2

ファイルを開く ~ fopen関数 FILE *fp FILE *fp; fp = fopen( “file.txt”, “r” ); データを読み込む対象の ”ファイル名” を指定 読み込みモードを指定(2つ目の引数に”r”を指定) 読み込みモードでファイルを開く操作 FILE *fp (ファイルポインタ) file.txt (ファイル) FILE *fp; fp = fopen( “file.txt”, “r” ); ファイルを指定 読込みモード ファイル名 fp を介して,ファイルにアクセスが可能! プログラミング入門2

ファイルを開く際のモードの種類 (テキストファイル) ファイルを開く際のモードの種類 (テキストファイル) モード 意味 “r” 読込み用にファイルを開く。ファイルが存在しない場合や見つからない場合は失敗する。 “w” 書き込み用にファイルを作成。ファイルが存在する場合はそのファイルの内容は破棄する。 “a” 追加書き込みのために既存ファイルを開く。ファイルが存在しない場合には作成する。 “r+” 読み書き用にファイルを開く。ファイルは存在していなければならない。 “w+” 読み書き用にファイルを作成。ファイルが存在する場合には,そのファイルの内容は破棄する。 “a+” 読込みと追加の両方のモードでファイルを開く。ファイルが存在しない場合は作成する。 プログラミング入門2

ファイルからのデータの読込み ~ fscanf関数 → fscanf関数(fileからのデータ入力) fscanf関数の書式 scanf関数 scanf( “%d”, &x); fscanf関数 100  file.txt fp = fopen( “file.txt”, “r” ); プログラム中の変数 int x fscanf fscanf( fp, “%d”, x ); データを読み込む対象の のファイル(ポインタ) プログラミング入門2

fscanf関数の使用例 ファイル:fscanf( fp, “%lf”, x ); 実数データの読み込み 文字列データの読込み 1行に並んでいる複数の型のデータを読み込み ファイル:fscanf( fp, “%lf”, x ); double x 文字配列1つ: char name[256] ← fscanf( fp, “%s”, str ); 複数の文字配列: char name[5][256] ← fscanf( fp, “%s”, str[i] ); fscanf( fp, “%d %s %f”, student_id, name, tensu ); char name[ 256] ; int student_id; double tensu; 1 aoki 80.5 file プログラミング入門2

ファイルを閉じる 使い終わったら,後片付け ファイルを閉じる ファイルを開く時に指定したファイルポインタを指定 fclose(fp); プログラミング入門2

ファイルからのデータの読込み 例題 ソースファイル名:player2.c データをファイルから読み込み,変数に格納, 表示 ファイルからのデータの読込み 例題 ソースファイル名:player2.c データをファイルから読み込み,変数に格納, 表示 #include <stdio.h> #define NUM 100 int main(void) { FILE *fp; char team[NUM][256]; char name[NUM][256]; int hr[NUM]; int i; fp = fopen("player.txt","r"); /* ファイルから選手データを読込み */ for(i=0; i < 5; i++){ fscanf(fp, "%s %s %d", team[i], name[i], &hr[i]); } for(i=0; i < 5; i++){ /* 読み込んだデータを画面表示 */ printf( "%s\t%s\t%d\n", team[i], name[i], hr[i]); } fclose(fp); return(0); 読込みモードで ファイルをオープン プログラミング入門2

入出力ファイル名の指定 これまでのプログラム ファイル名の指定 入出力ファイル名をプログラム中で指定 fp = fopen("player.txt","r"); キーボードからファイル名を指定できれば便利! char filename[256]; printf(“input filename : ”); scanf( “%s”, filename ); fp = fopen( filename, “r” ); プログラミング入門2

入出力ファイル名の指定 例題 指定したファイルが存在しなかったら? ソースファイル名:filename.c ファイル名を指定して開く 入出力ファイル名の指定 例題 ソースファイル名:filename.c ファイル名を指定して開く #include <stdio.h> int main(void) { FILE *fp; char filename[256]; printf( "Input file name : " ); scanf( "%s", filename ); fp = fopen(filename, "r"); printf("ファイル名は%sです", filename); /* ファイルからのデータ読込み */ /* データ処理 */ return(0); } ファイル名格納用変数 キーボードから入力した文字列を filenameに格納 Filenameでファイル名を指定して開く 指定したファイルが存在しなかったら? プログラミング入門2

ファイルが開けるかどうかのチェック fp = fopen(filename, "r"); if文を使って判定 fopen関数 の仕様 ファイルが開けるかどうかの判定 fp = fopen(filename, "r"); fpにそのファイルを指定するファイルポインタを格納 (fpには,そのファイルを指定可能にするための何らかの値が入る) ファイル”filename”が存在し,開ける場合 fpにはNULL(空)が代入される ファイル”filename”が存在しない,開けない場合 fp = fopen(filename, “r”) == NULL == それ以外の値 if文を使って判定 プログラミング入門2

ファイルが開けるかどうかのチェック 例題 ソースファイル名: filecheck.c 指定したファイルが開けるかどうかを判定 ファイルが開けるかどうかのチェック 例題 ソースファイル名: filecheck.c 指定したファイルが開けるかどうかを判定 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; char filename[256]; printf( "Input file name : " ); scanf( "%s", filename ); if( (fp = fopen(filename, "r") ) == NULL ){    printf("指定したファイル%sは開けません\n", filename);    printf("プログラムを終了します\n");    exit(1); } else{    printf( "file open成功!\n" );    printf( "ファイル名は%sです", filename ); /* ファイルからのデータ読込み,データ処理 */ return(0); ヘッダーを追加(exit関数使用のため) ファイルが開けるかどうかの判定  fp=NULL,  ファイルが開けなかった場合 プログラムを終了  fp != NULL : ファイルが開けた場合 プログラミング入門2

ポインタ

ポインタ 変数のメモリ空間上での振舞いを意識! C言語の理解を妨げる難敵の一つ 更にプログラミングの勉強を進めるためには,   超えなければならない壁 理解できれば,C言語の機能をフルに活用できるようになる これまで,流して説明してきた部分を理解できる scanf関数でなぜ変数に&をつけるの? 文字列をscanfで読み込む場合にはなぜ&が不要? 関数に配列を渡すとき,どうして配列名だけを書いて渡すの? ファイルポインタとは? その他 変数のメモリ空間上での振舞いを意識! プログラミング入門2

ポインタ の必要性 和と差の値は表示されない! どうして? ソースファイル名: list1001.c (p.226) ポインタ の必要性 ソースファイル名: list1001.c (p.226) 2つの整数の和と差を求める関数(間違い) #include <stdio.h> void sum_diff(int n1, int n2, int sum, int diff) { sum = n1 + n2; diff = n1 - n2; } int main(void) int na, nb; int wa = 0, sa = 0; puts("二つの整数を入力してください。"); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); sum_diff(na, nb, wa, sa); printf("wa = %d\n", wa); printf("sa = %d\n", sa); return (0); 和と差の値は表示されない! どうして? プログラミング入門2

解決にはポインタが必要! 関数呼び出しと引数の引渡し過程(復習) 重要 実引数の値が,仮引数にそれぞれ コピーされる main関数 int main(void) {    int na, nb; int sa=0, wa=0;    na = 10;    nb = 20; sum_diff( na, nb, wa, sa ); printf("wa = %d\n", wa); printf("sa = %d\n", sa); } 実引数の値が,仮引数にそれぞれ コピーされる (変数そのものでなく,中に格納されている値     が受け渡される!) 重要 実引数 20 10 仮引数 void sum_diff( int n1, int n2, int sum, int diff ) { sum = n1 + n2; diff = n1 – n2; } この関数内では,sumは30,  diffは-10となるが。。。 Main文のwa, saの値は 書き換えられない! 解決にはポインタが必要! プログラミング入門2

変数 と オブジェクト (p.227) 変数の型とオブジェクト 設計図と実体 double x; int m; x m 実体  設計図 型は設計図,オブジェクトは設計図に基づいて作られた実体 プログラミング入門2

論理的なオブジェクトと物理的なオブジェクト 変数(オブジェクト)は,記憶域(メモリ)中の一部を占める箱 int m; double x; オブジェクトは記憶域中の一部を占有する箱 物理的なオブジェクトの概念 現実 m x メモリ空間 1000番地 1008番地 イメージ オブジェクトは独立した個別の箱 アドレス(番地) x m 論理的なオブジェクトの概念 プログラミング入門2

アドレスとは? オブジェクトのアドレス オブジェクト(実体)が格納されているメモリ上の番地のこと プログラム中で変数を宣言 コンピュータのメモリ内にある場所(アドレス)に,ある大きさの領域を確保すること プログラミング入門2

アドレスを表示 ソースファイル名: list1002.c (p.228) オブジェクトのアドレスを表示 #include <stdio.h> int main(void) { int nx; double dx; int vc[3]; printf("nxのアドレス:%p\n", &nx); printf("dxのアドレス:%p\n", &dx); printf("vc[0]のアドレス:%p\n", &vc[0]); printf("vc[1]のアドレス:%p\n", &vc[1]); printf("vc[2]のアドレス:%p\n", &vc[2]); return (0); } プログラミング入門2

アドレス演算子(&) オブジェクトの頭に&をつけると,そのオブジェクトの格納されているアドレスを取り出すことが可能 アドレスをprintfで表示するための変換指定は%p m x メモリ空間 1000番地 1008番地 アドレス(番地) int m; double x; &m &x printf("nxのアドレス:%p\n", &nx); nxのアドレスを16進数で表示 プログラミング入門2

ポインタとは? int *p; ポインタ変数 ポインタの宣言 オブジェクトのアドレス(メモリ上の位置)を格納するためのもの int nx; ポインタ変数pの型は? → 「int *」型,int型オブジェクトへのポインタ型 プログラミング入門2

最初のポインタ・プログラム ソースファイル名:pointer1.c 整数の値とポインタの値を表示 表示される値を確認! #include <stdio.h> int main(void) { int  nx; int  *pt; nx = 57; pt = &nx; printf("nxの値:%d\n", nx); printf("nxのアドレス:%p\n", &nx); printf("ptの値:%p\n", pt); return (0); }  int型オブジェクトのアドレスを格納するための int型へのポインタ型=(int *)型 表示される値を確認! プログラミング入門2

プログラムの解説 int nx; int *pt; nx = 57; pt = &nx; pt 1000番地 メモリ上の番地 &nx = 代入 nxのアドレス pt int *型 = int型のアドレスを格納するための変数 printf("nxの値:%d\n", nx); printf("nxのアドレス:%p\n", &nx); printf("ptの値:%p\n", pt); 57 同じアドレスを示す プログラミング入門2

int型とintへのポインタ型 int *型 int型 pt その値は整数を格納する その値は整数 オブジェクトのアドレス nx  int  *pt;  int  nx; その値は整数を格納する オブジェクトのアドレス その値は整数 &nx は(int *)型 pt (int *)型 プログラミング入門2

ポインタがオブジェクトを「指す」 int nx; int *pt; pt = &nx; pt   という。 57 int  nx; int  *pt; pt = &nx; nx 1000番地 メモリ上の番地 &nx = 代入 nxのアドレス pt ptにはオブジェクトnxのアドレスが格納されているので,  ptはnxを指している といえる。 プログラミング入門2

間接演算子 ソースファイル名:pointer2.c ポインタが指すオブジェクトの値を表示 #include <stdio.h> int main(void) { int nx; int *pt; nx = 57; pt = &nx; printf( "nxのアドレス:%p\n", &nx); printf( "nxの値:%d\n", nx ); printf( "ptの値:%p\n", pt ); printf( "*ptの値:%d\n", *pt ); return(0); }  ptに,int型の変数nxのアドレスを代入 pt は nx を指す プログラミング入門2

ポインタとエイリアス(別名) pt pt int nx; int *pt; nx = 57; pt = &nx; pt は x を指す x ポインタpがオブジェクトxを指すとき,*pはxのエイリアス(別名)となる 重要 プログラミング入門2

ポインタが指すオブジェクトへの代入 pt *ptはnxのエイリアス nx *pt 300 *ptに300を代入することは, ソースファイル名:pointer3.c ポインタを介して,オブジェクトの値を変更 #include <stdio.h> int main(void) { int nx, ny; int *pt; pt = &nx; *pt = 100; printf( "nxの値:%d\n", nx ); printf( "*ptの値:%d\n", *pt ); pt = &ny; *pt = 300; printf( "nyの値:%d\n", ny ); return(0); } *ptはnxのエイリアス ptはnxを指す nx *pt 300 pt *ptに300を代入することは, nxに300を代入することと同じ プログラミング入門2

演習課題(第9回) 以下のようなサッカー選手のデータファイルをエディタ(emacs)で作成せよ。そのファイルから,選手名,アシスト数,ゴール数を読み込み,アシスト王,得点王,MVP(アシスト+得点がMAX)の選手を判定し,画面に結果を表示するプログラムを作成せよ。(kadai9-1.c) 名前 アシスト ゴール 選手数は各自で決めて良い 最大値を求める関数を自分で設計し、使用すること Takahara 7 20 Nakayama 5 13 Magron 2 8 Kazu 6 10 ・・・・・・・ ファイル:player.txt プログラミング入門2

演習課題 2. ポインタの理解(kadai9-2.c) 次の手順でプログラムを作成せよ。 Int型のオブジェクト x, y を宣言 Intへのポインタ型 ptr を宣言 x, yにそれぞれ,100,500を代入 ptr がオブジェクトxを指すようにする *ptrの値を表示 ptrを介して,xの値を400に変更 x, *ptrの値を表示 ptr がオブジェクトyを指すようにする ptrを介して,yの値を200に変更 y, *ptrの値を表示 プログラミング入門2

提出方法 演習課題1〜2のプログラムを作成し,動作確認した上で 提出方法: ソースファイル(kadai9-1.c 〜 kadai9-2.c) をメールに添付して提出せよ。 提出方法:   メールの題名(subjet)を, “pro2-9” + “学籍番号”+”自分の苗字”(全て半角英数文字にて)とする。 例) pro2-9 L02001 aoki 提出先: yaoki@sic.shibaura-it.ac.jp (青木アドレス) 提出期限: 12月10日(月) 13:00まで(時間厳守) プログラミング入門2