Presentation is loading. Please wait.

Presentation is loading. Please wait.

プログラミング論 ファイル入出力 http://www.ns.kogakuin.ac.jp/~ct13140/ProgC/

Similar presentations


Presentation on theme: "プログラミング論 ファイル入出力 http://www.ns.kogakuin.ac.jp/~ct13140/ProgC/"— Presentation transcript:

1 プログラミング論 ファイル入出力

2 概要 動的変数と静的変数の初期値 実引数と仮引数,値渡しと参照渡し ファイル処理 簡単 本当はものすごく難しいが,本日は簡単.
詳細は プログラミング3 の ポインタ にて ファイル処理 難しくないが,面倒? 慣れが必要

3 動的変数と静的変数の初期値 void main() { int x, y, z; printf("%d\n", x); printf("%d\n", y); printf("%d\n", z); } 実行結果 ↑ゴミが入っている (gcc & Linuxで実行) int x, y, z; void main() { printf("%d\n", x); printf("%d\n", y); printf("%d\n", z); } 実行結果 ↑0クリアされている グローバル変数,静的(static)変数は,自動的に0で初期化される. staticでないローカル変数は,初期化されずゴミが入っている.

4 動的変数と静的変数の初期値 void main() { int x, y, z; printf("%d\n", x); printf("%d\n", y); printf("%d\n", z); } Uninitialized variable 'x' used 初期化されていないローカル変数xが使用されています ↑実行できな (Visual Studio 2015で実行) グローバル変数,静的(static)変数は,自動的に0で初期化される. staticでないローカル変数は,初期化されずゴミが入っている.

5 動的変数と静的変数の初期値 void main() { int x[3]; printf("%d\n", x[0]); printf("%d\n", x[1]); printf("%d\n", x[2]); } 実行結果 ↑ゴミが入っている Visual Studioでも実行可能 void main() { static int x[3]; printf("%d\n", x[0]); printf("%d\n", x[1]); printf("%d\n", x[2]); } 実行結果 ↑0クリアされている グローバル変数,静的(static)変数は,自動的に0で初期化される. staticでないローカル変数は,初期化されずゴミが入っている.

6 実引数 と 仮引数 値渡し と 参照渡し

7 関数の仮引数と実引数(値渡し) void func(int a){ a = 7; } void main(){ int x = 3;
func(x); printf("%d\n", x); x 100 番地 3

8 関数の仮引数と実引数(値渡し) void func(int a){ a = 7; } void main(){ int x = 3;
func(x); printf("%d\n", x); x 100 番地 3

9 関数の仮引数と実引数(値渡し) void func(int a){ a = 7; } void main(){ int x = 3;
func(x); printf("%d\n", x); x a 100 番地 104 番地 3 3 別のメモリに割り当てられた 別の変数

10 関数の仮引数と実引数(値渡し) void func(int a){ a = 7; } void main(){ int x = 3;
func(x); printf("%d\n", x); x a 100 番地 104 番地 3 7 別のメモリに割り当てられた 別の変数

11 関数の仮引数と実引数(値渡し) void func(int a){ a = 7; } void main(){ int x = 3;
func(x); printf("%d\n", x); x 100 番地 3 実行結果 3

12 関数の仮引数と実引数(値渡し) void func(int x){ x = 7; } void main(){ int x = 3;
この2個を 同じ名前にしても 結果は変わらない. void func(int x){ x = 7; } void main(){ int x = 3; func(x); printf("%d\n", x); x x 100 番地 104 番地 3 3 実行結果 別のメモリに割り当てられた 別の変数 3

13 関数の仮引数と実引数(参照渡し) void func(int a[2]){ a[0]=3; } void main(){ int x[2];
x[0]=10; x[1]=20; func(x); printf("%d %d\n", x[0], x[1]); X[0] X[1] 100 番地 104 番地 X[] 10 20

14 関数の仮引数と実引数(参照渡し) void func(int a[2]){ a[0]=3; } void main(){ int x[2];
x[0]=10; x[1]=20; func(x); printf("%d %d\n", x[0], x[1]); X[0] X[1] 100 番地 104 番地 X[] 10 20

15 関数の仮引数と実引数(参照渡し) void func(int a[2]){ a[0]=3; } void main(){ int x[2];
x[0]=10; x[1]=20; func(x); printf("%d %d\n", x[0], x[1]); a[0] a[1] X[0] X[1] 100 番地 104 番地 X[] 10 20

16 関数の仮引数と実引数(参照渡し) void func(int a[2]){ a[0]=3; } void main(){ int x[2];
x[0]=10; x[1]=20; func(x); printf("%d %d\n", x[0], x[1]); a[0] a[1] X[0] X[1] 100 番地 104 番地 X[] 3 20

17 関数の仮引数と実引数(参照渡し) void func(int a[2]){ a[0]=3; } void main(){ int x[2];
x[0]=10; x[1]=20; func(x); printf("%d %d\n", x[0], x[1]); X[0] X[1] 100 番地 104 番地 X[] 3 20 実行結果 3 20

18 ファイル処理 (入門編)

19 ファイルを開く (a) fopen("ファイル名", "モード"); 戻り値: 成功したらファイルへのポインタ, 失敗したら NULL. 使用例 FILE *fp; fp = fopen("s:\\a.txt", "rt"); if( fp == NULL ){ perror("ファイルを開けません."); }

20 ファイル処理例 0a #include <stdio.h> // fopenやNULLなどに必要 #include <stdlib.h> // exit()に必要 int main() { FILE *fp; fp = fopen("S:\\a.txt", "wt"); if ( fp == NULL ) { perror("ファイルを開けません"); exit(1); } fprintf( fp, "Hello, World!\n"); fclose(fp); return 0; ファイルポインタ変数 fpを宣言. FILE *型のfpという名の変数 fopenでファイルを開く. 以後,変数fpが そのファイルを象徴 Open成功なら 非NULL. 失敗ならNULL fpが象徴する ファイルにprintf fcloseで ファイルを閉じる.

21 ファイルを開く (b) fopen_s(&fp, "ファイル名", "モード"); 戻り値: 成功したら0. 失敗したら0以外. 使用例 FILE *fp; int ret; ret = fopen(&fp, "s:\\a.txt", "rt"); if( ret == 0 ){ perror("ファイルを開けません."); }

22 ファイル処理例 0b #include "stdafx.h" #include <stdlib.h> // exit()に必要 int main() { FILE *fp; int ret; ret = fopen_s( &fp, "S:\\a.txt", "wt"); if ( ret != 0 ) { perror("ファイルを開けません"); exit(1); } fprintf(fp, "Hello, World!\n"); fclose(fp); return 0;

23 fgetc (1/2) int fgetc(FILE *fp); ファイルfpから1文字読み込む. 戻り値:
 正常時 読み込んだ文字の文字コード  失敗時 -1 例えば,ファイルの終端に至り これ以上読み込めない状況で fgetc を行うと,失敗となる.

24 fgetc (2/2) int ret; ret = fgetc( fp ); if( ret == -1 ){ perror("ファイル読み込み失敗."); exit(1); } else { printf("文字=%c ",ret); printf("文字コード=%d\n", ret); }

25 #include "stdafx. h" #include <stdlib
#include "stdafx.h" #include <stdlib.h> int main() { int ret, ch; FILE *fp; ret = fopen_s(&fp, "S:\\a.txt", "rt"); if( ret != 0) { perror("ファイルを開けません"); exit(1); } while( (ch = fgetc(fp)) != -1 ){ printf("(%c,%d)\n", ch, ch); fclose(fp); return 0; ファイル処理例 1

26 実行結果 (H,72) (e,101) (l,108) (o,111) (,,44) ( ,10) (W,87) (r,114) (d,100) (!,33)
ファイル処理例 1 "S:\a.txt" Hello, World!

27 #include "stdafx. h" #include <stdlib
#include "stdafx.h" #include <stdlib.h> int main(){ int ret, ch, cnt = 0; FILE *fp; ret = fopen_s(&fp, "S:\\a.txt", "rt"); if (ret != 0) { perror("ファイルを開けません"); exit(1); } while( (ch = fgetc(fp)) != -1 ) { if( ch == 'o' ){ //文字aの文字コードは'a' cnt++; fclose(fp); printf("o は %d個ありました.\n", cnt); return 0; ファイル処理例 2

28 ファイル処理例 2 実行結果 o は 2個ありました. "S:\a.txt" Hello, World!

29 良くある短縮表記 fp = fopen("S:\\a.txt", "wt"); if( fp == NULL ){ ↓ if( (fp=fopen("S:\\a.txt","wt")) == NULL ) { ret = fopen_s(&fp, "S:\\a.txt", "rt"); if( ret != 0){ if( (fopen_s(&fp,"S:\\a.txt","rt")) != 0 ){


Download ppt "プログラミング論 ファイル入出力 http://www.ns.kogakuin.ac.jp/~ct13140/ProgC/"

Similar presentations


Ads by Google