1 / 10

第 14 週 ファイル

第 14 週 ファイル. プログラミング言語 2014 立命館大学情報理工学部. List13-8 (P.308). List1 3-9 (P.309). /* 円周率の値をテキストファイルに書き込んで読み取る * / #include < stdio.h > int main(void) { FILE * fp ; double pi = 3.14159265358979323846; /* 書込み * /

zlhna
Download Presentation

第 14 週 ファイル

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第14週ファイル プログラミング言語 2014 立命館大学情報理工学部

  2. 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週のプログラム 

  3. ファイルへデータの読み書きする方法を学ぶ • 基本的な流れ ストリームポインタ(FILE * 型)を媒介    (FILE 構造体:ファイルに関する情報が書いてある) ① ファイルをオープンするfopen関数 FILE *fp;   (*fp:ストリームポインタ) fp= fopen(ファイル名,モード);[例] 読取りモード"r" ② ファイルに書込む,ファイルから読取る [書込む] fprintf(fp, “printfと同じ”); 他に fputc,fputs関数など [読取る] fscanf(fp, “scanfと同じ”); 他にfgetc,fgets関数など ③ファイルをクローズする fclose(fp); • エラーの処理と注意点 • テキストファイルとバイナリファイル 第14週のポイント 

  4. 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" 追加書込みモード

  5. 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)

  6. 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)

  7. 教科書該当ページなし • ファイルの読取り 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)

  8. 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として) テキストファイルとバイナリファイル

  9. 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; }  バイナリファイルの読取りと書込み

  10. なんという名前のファイルに何が記入されるか?なんという名前のファイルに何が記入されるか? 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 が書かれている

More Related