100 likes | 242 Views
第 14 週 ファイル. プログラミング言語 2014 立命館大学情報理工学部. List13-8 (P.308). List1 3-9 (P.309). /* 円周率の値をテキストファイルに書き込んで読み取る * / #include < stdio.h > int main(void) { FILE * fp ; double pi = 3.14159265358979323846; /* 書込み * /
E N D
第14週ファイル プログラミング言語 2014 立命館大学情報理工学部
List13-8 (P.308) List13-9 (P.309) /* 円周率の値をテキストファイルに書き込んで読み取る */ #include <stdio.h> int main(void) { FILE *fp; double pi = 3.14159265358979323846; /* 書込み */ if ((fp = fopen("PI.txt", "w")) == NULL) /* オープン */ printf("\aファイルをオープンできません。\n"); else { fprintf(fp, "%f", pi); /* piを書き込む */ fclose(fp); /* クローズ */ } /* 読取り */ if ((fp = fopen("PI.txt", "r")) == NULL) /* オープン */ printf("\aファイルをオープンできません。\n"); else { fscanf(fp, "%lf", &pi); /* piに読み取る */ printf("円周率は%23.21fです。\n", pi); fclose(fp); /* クローズ */ } return 0; } /* 円周率の値をバイナリファイルに書き込んで読み取る */ #include <stdio.h> int main(void) { FILE *fp; double pi= 3.14159265358979323846; /* 書込み */ if ((fp = fopen("PI.bin", "wb")) == NULL) /* オープン */ printf("\aファイルをオープンできません。\n"); else { fwrite(&pi, sizeof(double), 1, fp); /* piを書き込む */ fclose(fp); /* クローズ */ } /* 読取り */ if ((fp = fopen("PI.bin", "rb")) == NULL) /* オープン */ printf("\aファイルをオープンできません。\n"); else { fread(&pi, sizeof(double), 1, fp); /* piに読み取る */ printf("円周率は%23.21fです。\n", pi); fclose(fp); /* クローズ */ } return 0; } 第14週のプログラム
ファイルへデータの読み書きする方法を学ぶ • 基本的な流れ ストリームポインタ(FILE * 型)を媒介 (FILE 構造体:ファイルに関する情報が書いてある) ① ファイルをオープンするfopen関数 FILE *fp; (*fp:ストリームポインタ) fp= fopen(ファイル名,モード);[例] 読取りモード"r" ② ファイルに書込む,ファイルから読取る [書込む] fprintf(fp, “printfと同じ”); 他に fputc,fputs関数など [読取る] fscanf(fp, “scanfと同じ”); 他にfgetc,fgets関数など ③ファイルをクローズする fclose(fp); • エラーの処理と注意点 • テキストファイルとバイナリファイル 第14週のポイント
PP.290--295 ファイル「abc」を読取りモードで オープンしてクローズする例 • FILE * 型のポインタ準備 FILE *fp; (変数 fpは例) • ファイルのオープン fp = fopen ( file名 ,モード) ; 以後,fpとfile名のファイルが 関係づけられる オープンに失敗すると NULL を返す • ファイルのクローズ fclose(fp); List13-1 (P.295) /* ファイルのオープンとクローズ */ #include <stdio.h> int main(void) { FILE *fp; fp= fopen("abc", "r"); /* ファイルのオープン */ if (fp == NULL) printf("\aファイルをオープンできません。\n"); else { /* ファイルから読込みなどを行う */ fclose(fp); /* ファイルのクローズ */ } return 0; } ファイルのオープンとクローズ モード:【P.223の表を参照】 "r" 読取りモード "w" 書込みモード "a" 追加書込みモード
PP.296--299 • ファイルの読取り fscanf( fp ,scanfと同じ) ; 読取りモード ”r" で fopenしておく 標準入力ストリーム:stdin 以下の2つは同じ動作 fscanf( stdin, "%lf", &x ); scanf("%lf", &x ); • ファイルの書込み fprintf( fp ,printfと同じ) ; 書込みモード “w" で fopenしておく 標準出力ストリーム:stdout 以下の2つは同じ動作 fprintf( stdout, "%f", x ); printf("%f", x ); List13-8 (P.306) /* 円周率の値をテキストファイルに書き込んで読み取る */ #include <stdio.h> int main(void) { FILE *fp; double pi = 3.14159265358979323846; /* 書込み */ if ((fp = fopen("PI.txt", "w")) == NULL) /* オープン */ printf("\aファイルをオープンできません。\n"); else { fprintf(fp, "%f", pi); /* piを書き込む */ fclose(fp); /* クローズ */ } /* 読取り */ if ((fp = fopen("PI.txt", "r")) == NULL) /* オープン */ printf("\aファイルをオープンできません。\n"); else { fscanf(fp, "%lf", &pi); /* piに読み取る */ printf("円周率は%23.21fです。\n", pi); fclose(fp); /* クローズ */ } return 0; } ファイルの読取りと書込み(1)
PP.302--305 • ファイルの読取り ch = fgetc( fp) ; 読取りモード "r" で fopenしておく ファイル(入力ストリーム fp)から あれば1文字読取る int型(文字に対応する整数) に変換して出力する 終わりやエラーを検出⇒EOFを返す • ファイルの書込み fputc ( ch ,fp) ; 書込みモード "w" で fopenしておく ファイル(出力ストリーム fp)へ int型の変数 chに対応する 文字を出力する List13-7 (P.304) /* ファイルをコピーする */ #include <stdio.h> int main(void) { intch; FILE *sfp, *dfp; char sname[64], dname[64]; /* ファイル名 */ printf("コピー元ファイル名:"); scanf("%s", sname); printf("コピー先ファイル名:"); scanf("%s", dname); if ((sfp = fopen(sname, "r")) == NULL) /* コピー元をオープン */ printf("\aコピー元ファイルをオープンできません。\n"); else { if ((dfp = fopen(dname, "w")) == NULL) /* コピー先をオープン */ printf("\aコピー先ファイルをオープンできません。\n"); else { while ((ch = fgetc(sfp))!= EOF) fputc(ch, dfp); fclose(dfp); /* コピー先をクローズ */ } fclose(sfp); /* コピー元をクローズ */ } return 0; } ファイルの読取りと書込み(2)
教科書該当ページなし • ファイルの読取り char buf[長さ]; (長さは1行の文字数より十分長く) fgets( buf , 長さ, fp) ; 読取りモード "r" で fopenしておく ファイル(入力ストリーム fp)から 1行分(または長さ分)文字列 bufへ 読取る 終わりやエラーを検出⇒NULLを返す • 文字列からの書式付読取り sscanf( buf ,scanfと同じ) ; List13-8 modified (P.306) /* 円周率の値をテキストファイルに書き込んで読み取る */ #include <stdio.h> int main(void) { FILE *fp; double pi = 3.14159265358979323846; char buf[256]; /* 書込み */ if ((fp = fopen("PI.txt", "w")) == NULL) /* オープン */ printf("\aファイルをオープンできません。\n"); else { fprintf(fp, "%f", pi); /* piを書き込む */ fclose(fp); /* クローズ */ } /* 読取り */ if ((fp = fopen("PI.txt", "r")) == NULL) /* オープン */ printf("\aファイルをオープンできません。\n"); else { fgets(buf, 256, fp); /* bufに読み取る */ sscanf(buf, "%lf", &pi); /* piに読み取る */ printf("円周率は%23.21fです。\n", pi); fclose(fp); /* クローズ */ } return 0; } ファイルの読取り(3)
P.307 • テキストファイル(エディタで読める) 数値を「文字で」表しその文字をビットでファイルに記録 [例] 整数値 357⇒ 文字 3 と 5 と 7 ⇒ビット 00110011 00110101 00110111 (文字「3」は JISコード 0x33 で 00110011 ) [例] 整数値 2057⇒ 文字 2 と 0 と 5 と 7 ⇒ビット 00110010 00110000 00110101 00110111 • バイナリファイル(一般にサイズが小さい,読み書きが速い) 数値を直接ビットでファイルに記録 [例] 整数値 357⇒ 1x28+1x26+1x25+1x22+1x20 ⇒ビット 0000000101100101 (文字「3」は JISコード 0x33 で 00110011 ) [例] 整数値 2057⇒1x211+1x23+1x20 ⇒ビット 0000100000001001(short intとして) テキストファイルとバイナリファイル
PP.306--309 • バイナリファイルの読取り fread関数 読取りモード "rb" で fopenしておく [例]int型の数値 10個読取る int a[10]; fread ( a , sizeof(int) , 10 , fp ); 読取りに成功した要素数を返す • バイナリファイルの書込み fwrite関数 書込みモード "wb" で fopenしておく [例]int型の数値 10個書込む inta[10]; fwrite( a, sizeof(int) , 10 , fp ); 書込みに成功した要素数を返す List13-9 (P.309) /* 円周率の値をバイナリファイルに書き込んで読み取る */ #include <stdio.h> int main(void) { FILE *fp; double pi= 3.14159265358979323846; /* 書込み */ if ((fp = fopen("PI.bin", "wb")) == NULL) /* オープン */ printf("\aファイルをオープンできません。\n"); else { fwrite(&pi, sizeof(double), 1, fp); /* piを書き込む */ fclose(fp); /* クローズ */ } /* 読取り */ if ((fp = fopen("PI.bin", "rb")) == NULL) /* オープン */ printf("\aファイルをオープンできません。\n"); else { fread(&pi, sizeof(double), 1, fp); /* piに読み取る */ printf("円周率は%23.21fです。\n", pi); fclose(fp); /* クローズ */ } return 0; } バイナリファイルの読取りと書込み
なんという名前のファイルに何が記入されるか?なんという名前のファイルに何が記入されるか? Listoriginal #include <stdio.h> int main(void) { FILE *fp1, *fp2; double pi = 3.14159265358979323846; if ((fp1= fopen("file1.txt", "w")) == NULL) printf("\aファイルをオープンできません。\n"); else { fprintf(fp1, "%f", pi); fclose(fp1); } if ((fp1= fopen("file1.txt", "r")) == NULL) printf("\aファイルをオープンできません。\n"); else { if ((fp2= fopen("file2.txt", "w")) == NULL) printf(“\aファイルをオープンできません。\n"); else { fscanf(fp1,"%lf", &pi); fprintf(fp2,"%.8f", pi); fclose(fp2); } fclose(fp1); } if ((fp1= fopen("file3.txt", "a")) == NULL) printf("\aファイルをオープンできません。\n"); else { if ((fp2= fopen("file2.txt", "a")) == NULL) printf("\aファイルをオープンできません。\n"); else { fprintf(fp1,"%f", pi); fprintf(fp2,"%f", pi); fclose(fp2); } fclose(fp1); } return 0; } クイズ 正解は file1.txtとfile3.txtに 3.141592 file2.txtに 3.141592003.141592 が書かれている