• 検索結果がありません。

ヒントスライドPPT プログラミング演習2 #prog2bkc net

N/A
N/A
Protected

Academic year: 2018

シェア "ヒントスライドPPT プログラミング演習2 #prog2bkc net"

Copied!
22
0
0

読み込み中.... (全文を見る)

全文

(1)

第 1 週

ファイル入出力と構造体

プログラミング演習2

(2)

2

ファイル入出力と構造体

習得すること

復習

変数

配列

scanf

ファイル

• fopen,

オープンモード

• fscanf, fprintf

• fclose

構造体

構造体配列

構造体初期値設定

 ユーザ定義型  typedef

(3)

3

ファイル入出力と構造体

復習:変数

変数

数値や文字を格納する箱のようなもの

型によってサイズが違う – char 型: 1 バイト – short 型: 2 バイト

– int 型: 4 バイト(環境によって異な る)

1 バイト

2バイト

4 バイト int main(void){

char c; short s; int num; ...

return 0; }

int main(void){ char c;

short s; int num; ...

return 0; }

型名 変数名

(4)

4

ファイル入出力と構造体

復習:変数

変数

数値や文字を格納する箱のようなもの

型によってサイズが違う – char 型: 1 バイト – short 型: 2 バイト

– int 型: 4 バイト(環境によって異な る)

1 バイト

2バイト

4 バイト int main(void){

char c =‘a’; short s = 10;

int num = 100000; ...

return 0; }

int main(void){ char c =‘a’; short s = 10;

int num = 100000; ...

return 0; }

型名 変数名

(5)

5

ファイル入出力と構造体

復習:配列

配列

複数の同じ型の変数をまとめたもの

int   a[ 4 ];

int   a[ 4 ];

型 名前 要素数

(6)

6

scanf ( 複数の変数の読込み方 )

int main(void){ int a, b;

scanf(“%d”,&a); scanf(“%d”,&b); }

int main(void){ int a, b;

scanf(“%d”,&a); scanf(“%d”,&b); }

int main(void){ int a, b;

scanf(“%d %d”,&a, &b); }

int main(void){ int a, b;

scanf(“%d %d”,&a, &b); }

int の場合

文字列の場合

int main(void){

char s1[ 10 ], s2[ 10 ]; scanf(“%s” ,s1);

scanf(“%s”,s2); }

int main(void){

char s1[ 10 ], s2[ 10 ]; scanf(“%s” ,s1);

scanf(“%s”,s2); }

int main(void){

char s1[ 10 ], s2[ 10 ]; scanf(“%s %s” ,s1, s2); }

int main(void){

char s1[ 10 ], s2[ 10 ]; scanf(“%s %s” ,s1, s2); }

文字列以外の変数には&を付ける

(文字列には&は必要ない) 同じ

同じ

2個以上でもまとめることができる

(7)

7

scanf ( 複数の変数の読込み方 )

int main(void){ int a;

char s[ 10 ];

scanf(“%d”,&a); scanf(“%s”,s); }

int main(void){ int a;

char s[ 10 ];

scanf(“%d”,&a); scanf(“%s”,s); }

int main(void){ int a;

char s[ 10 ];

scanf(“%d %s”,&a, s); }

int main(void){ int a;

char s[ 10 ];

scanf(“%d %s”,&a, s); }

int と文字列の場合

同じ

2個以上でもまとめることができる fscanf も同様の記述ができる

(8)

8

ファイル入出力と構造体

ファイル :ファイルオープン

FILE *fp;

fp = fopen( “indata.data” , ”r” ); FILE *fp;

fp = fopen( “indata.data” , ”r” ); ファイルの開き方

fopen( “ファイル名” , ”オープンモー ド” );

オープンモード

“ r” : 読み出し専用

“ w” : 書込み専用

  (すでにあるファイルはなくなるので注意)

“ a” : 追加書込み

 他にもありますが、

とりあえずこの 3 つを使えるようにしましょう

オープンモード

“ r” : 読み出し専用

“ w” : 書込み専用

  (すでにあるファイルはなくなるので注意)

“ a” : 追加書込み

 他にもありますが、

とりあえずこの 3 つを使えるようにしましょう

ファイルポインタの宣言 注:ポインタは来週学びます

開く 操作 閉じる

(9)

9

ファイル入出力と構造体

ファイル :エラーの確認(ファイルが開けた

か?)

fp = fopen(“indata.data”,”r”); if( fp == NULL ){

// エラーメッセージ   // エラー処理

}

fp = fopen(“indata.data”,”r”); if( fp == NULL ){

// エラーメッセージ   // エラー処理

}

if( (fp = fopen(“indata.data”,”r”)) == NULL){ // エラーメッセージ

  // エラー処理 }

if( (fp = fopen(“indata.data”,”r”)) == NULL){ // エラーメッセージ

  // エラー処理 }

ファイルが開けなかった場合には fp には NULL が代入されます

代入時にエラーの確認もできます

printf などでエラーメッセージを出力 return 1; や exit(1); を使うことが多い

(10)

10

ファイル入出力と構造体

ファイル:読込み

FILE *fp; int num;

if( (fp = fopen(“indata.data”, ”r”)) == NULL){ // エラーメッセージ

  // エラー処理 }

fscanf(fp, “%d”, &num ); ...

FILE *fp; int num;

if( (fp = fopen(“indata.data”, ”r”)) == NULL){ // エラーメッセージ

  // エラー処理 }

fscanf(fp, “%d”, &num ); ...

ファイルの読込み

fscanf( ファイルポインタ , scanf と同じ形 式 );

オープンモードを

読込み専用(“r”)にする

開く 操作 閉じる

(11)

11

ファイル入出力と構造体

ファイル入力の終了判定

開く 操作 閉じる

while( fscanf(fp, “%d”, &num ) != EOF){

...

}

while( fscanf(fp, “%d”, &num ) != EOF){

...

}

ファイルの入力データの終わりの場合は、 fscanf 関数では戻り値 EOF を返す

EOF(End Of File)

他の終了判定方法は feof 関数がある

書式 int feof( FILE* fp )

戻り値 0 :ファイル終端ではない     0 以外:ファイル終端

他の終了判定方法は feof 関数がある

書式 int feof( FILE* fp )

戻り値 0 :ファイル終端ではない     0 以外:ファイル終端

(12)

12

ファイル入出力と構造体

ファイル:ファイルへ出力

FILE *fpout;

if( (fpout = fopen(“outdata.data”, ”w”)) == NULL){ // エラーメッセージ

  // エラー処理 }

fprintf(fpout,“Output test.\n”); ...

FILE *fpout;

if( (fpout = fopen(“outdata.data”, ”w”)) == NULL){ // エラーメッセージ

  // エラー処理 }

fprintf(fpout,“Output test.\n”); ...

ファイルへの出力

fprintf( ファイルポインタ , printf と同じ形 式 );

オープンモードを

書込み専用(“w”)にする

開く 操作 閉じる

(13)

13

ファイル入出力と構造体

ファイル :ファイルのクローズ

FILE *fp; int num;

if( (fp = fopen(“indata.data”,”r”)) == NULL){ // エラーメッセージ

  // エラー処理 }

// ファイルを利用した処理 fclose(fp);

FILE *fp; int num;

if( (fp = fopen(“indata.data”,”r”)) == NULL){ // エラーメッセージ

  // エラー処理 }

// ファイルを利用した処理 fclose(fp);

ファイルを閉じる fclose( ファイルポインタ );

ファイル利用後には必ずファイ ルを閉じる

開く 操作 閉じる

(14)

14

ファイル入出力と構造体

復習:構造体:構造体とは?

構造体

複数の型の変数をまとめたもの

char name[20]; int age;

char name[20]; int age;

struct Person{ char name[20]; int age;

};

struct Person{ char name[20]; int age;

};

struct Person

(15)

15

ファイル入出力と構造体

復習:構造体:構造体の定義

構造体

複数の型の変数をまとめたもの

struct Person{ char name[20]; int age;

};

struct Person{ char name[20]; int age;

};

構造体の定義 struct 構造体名 { 型名 メンバ名 ; 型名 メンバ名 ;

}; 必要な回数

型名 メンバ名; を繰り返す

構造体内の変数を

構造体のメンバと呼ぶ

(16)

16

ファイル入出力と構造体

復習:構造体:構造体の宣言

struct Person person; person.age = 30;

strcpy(person.name,”Takuya Azumi”); struct Person person;

person.age = 30;

strcpy(person.name,”Takuya Azumi”);

構造体の宣言

struct 構造体名 変数;

person

(17)

17

ファイル入出力と構造体

復習:構造体:構造体メンバへのアクセス

struct Person person; person.age = 30;

strcpy(person.name,”Takuya Azumi”); struct Person person;

person.age = 30;

strcpy(person.name,”Takuya Azumi”);

メンバのアクセス方法 構造体の変数名 .メンバ名

person

(18)

18

ファイル入出力と構造体

復習:構造体:構造体メンバへのアクセス

struct Person person; person.age = 30;

strcpy(person.name,”Takuya Azumi”); struct Person person;

person.age = 30;

strcpy(person.name,”Takuya Azumi”);

メンバのアクセス方法 構造体の変数名 .メンバ名

person

strcpy は文字列のコピーを行う関

(19)

19

ファイル入出力と構造体

構造体:構造体の初期化(宣言時)

struct Person person = {“Takuya Azumi”, 30}; struct Person person = {“Takuya Azumi”, 30};

person

構造体の初期化

struct 構造体名 変数名 = { 値 ,  値 } ;

struct Person{ char name[20]; int age;

};

struct Person{ char name[20]; int age;

}; 値の順番はメンバ宣言の順番と同じ

name に格

age に格納

(20)

20

ファイル入出力と構造体

構造体:構造体配列

 構造体も配列にできます

people[ 0

] people[ 1 ]

struct Person people[ 2 ]; struct Person people[ 2 ];

構造体配列の宣言

struct 構造体名 変数名 [ 要素 数 ];

// 構造体配列のアクセスの方法

people[ 0 ].age = 30;

strcpy(people[ 0 ].name,"Takuya Azumi"); people[ 1 ].age = 40;

strcpy(people[ 1 ].name,"Taro Ritsumei"); // 構造体配列のアクセスの方法

people[ 0 ].age = 30;

strcpy(people[ 0 ].name,"Takuya Azumi"); people[ 1 ].age = 40;

strcpy(people[ 1 ].name,"Taro Ritsumei");

(21)

21

ファイル入出力と構造体

typedef unsigned int uint; uint data;

typedef unsigned int uint; uint data;

構造体: typedef: 新しい型名を付ける

typedef struct Person { char name[20];

int age; }PERSON;

typedef struct Person { char name[20];

int age; }PERSON;

typedef の使い方

typedef 型の定義 新しい型名 ;

PERSON person; PERSON person;

struct Person person; struct Person person;

typedef を利用する場合は、 ここの名前を省略可

どちらも同じ意味になります 新しい型名

(22)

著者リスト

22

ファイル入出力と構造体

1. 安積 卓也(情報システム学科)

参照

関連したドキュメント

社会調査論 調査企画演習 調査統計演習 フィールドワーク演習 統計解析演習A~C 社会統計学Ⅰ 社会統計学Ⅱ 社会統計学Ⅲ.

「AI 活用データサイエンス実践演習」 「AI

卒論の 使用言語 選考要件. 志望者への

国際地域理解入門B 国際学入門 日本経済基礎 Japanese Economy 基礎演習A 基礎演習B 国際移民論 研究演習Ⅰ 研究演習Ⅱ 卒業論文

授業は行っていません。このため、井口担当の 3 年生の研究演習は、2022 年度春学期に 2 コマ行います。また、井口担当の 4 年生の研究演習は、 2023 年秋学期に 2

使用言語 日本語 選考要件. 登録届を提出するまでに個別面談を受けてください。留学中で直接面談 できない場合は Skype か

卒論の 使用言語 選考要件

0:Boolean,1:Boolean+Data(15bit),2:Data(16bit) Modbus Function Code fDatModbusFuncCD char(2) ('03') 0x03,0x04,0x10. fDatTagID