第13回 ファイル処理 ファイルの入出力 データの入力と出力 scanf関数 コンピュータ キーボード printf関数 画面 コンピュータ fscanf関数 コンピュータ ファイル fprintf関数 ファイル コンピュータ ファイル処理の流れ 1.ファイルポインタの宣言 FILE* fp1; FILE* fp2; fp1, fp2 はファイルポインタ read用 2.ファイルのオープン fp1 = fopen(”file1.dat”, ”r”); fp2 = fopen(”file2.dat”, ”w”); 3.ファイルからの入力 write用 fscanf(fp1, ”%d”, &x); 4.ファイルへの出力 fprintf(fp2, ”%d¥n”, x); 5.ファイルのクローズ fclose(fp1); fclose(fp2); 1.ファイルポインタの宣言 FILE* fp1; FILE* fp2; fp1, fp2 はファイルポインタ 【参考】 * は,ポインタ演算子と呼ばれる演算子の一種. FILE というデータ型名と空白で区切ってもよい. FILE * fp1; FILE * fp2; 実際にはつぎのように書くのが慣習 FILE *fp1, *fp2; (これだと fp1, fp2 の 2 つをまとめて宣言できる) scanf で用いられる & もポインタ演算子 の一種 ポインタについては, 計算機プログラミングⅡ で詳しく学ぶ 2.ファイルのオープン read用 fp1 = fopen(”file1.dat”, ”r”); fp2 = fopen(”file2.dat”, ”w”); write用 readストリーム file1.dat fp1 writeストリーム fp2 file2.dat 3.ファイルからの入力(1/2) fp のところに stdin と書けば,標準入力 (キーボード)からの入力 にも使える int fgetc(FILE* fp1); 1文字をファイルから読み込んで返す char* fgets(char s[], int n, FILE* fp1); 1行(最大 n-1字:改行コードを含む)をファイルから s[] に読み込み,ヌル文字(’¥0’)を付加して返す int fscanf(FILE* fp1, 書式指定文字列, ...); 書式にしたがってファイルからデータを読み込む 3.ファイルからの入力(2/2) ■ファイルの終わり(End Of File)の検出 int fgetc(FILE* fp1); 入力がないときはstdio.hで定義されている EOF の値を返す(たいていは,EOF=-1) char* fgets(char s[], int n, FILE* fp1); 入力がないときはstdio.hで定義されている NULL の値(ヌルポインタ)を返す int fscanf(FILE* fp1, 書式指定文字列, ...); 入力がないときはstdio.hで定義されている EOF の値を返す(たいていは,EOF=-1) 4.ファイルへの出力 fp のところに stdout と書けば,標準出力(画面) への出力にも使える fputc(int c, FILE* fp2); 文字 c をファイルに書き込む c は int 型の文字コード fputs(char s[], FILE* fp2); 文字列 s[]をファイルに書き込む fprintf(FILE* fp2, 書式指定文字列, ...); 書式にしたがってデータをファイルに書き込む 5.ファイルのクローズ fclose(fp1); fclose(fp2); ファイルポインタとファイルとの関係を切る readストリーム fp1 X file1.dat writeストリーム fp2 X file2.dat 【使用例 1/5】 整数データ1個をコピー #include <stdio.h> file1.dat 25 int main(void) { FILE *fp1, *fp2; int x; fp1 = fopen(”file1.dat”, ”r”); fp2 = fopen(”file2.dat”, ”w”); fp1 x 25 fp2 fscanf(fp1, ”%d”, &x); fprintf(fp2, ”%d¥n”, x); fclose(fp1); fclose(fp2); return 0; } 25 file2.dat 【使用例 2/5】 個数のわかっている整数データを 文字データに変換(1/2) smile.dat x #include <stdio.h> int main(void) { FILE *fp1, *fp2; int x, y; int A[2][5]; fp1 = fopen(”smile.dat”, ”r”); for(y=0; y<2; y++){ for(x=0; x<5; x++){ fscanf(fp1, ”%d”, &A[y][x]); } } fclose(fp1); 40 94 95 94 41 119 32 32 32 119 y fp1 A[2][5] fp2 (^_^) w w smile.txt 次のスライドにつづく 【使用例 2/5】 個数のわかっている整数データを 文字データに変換(2/2) smile.dat x fp2 = fopen(”smile.txt”, ”w”); 40 94 95 94 41 for(y=0; y<2; y++){ 119 32 32 32 119 for(x=0; x<5; x++){ fprintf(fp2, ”%c”, A[y][x]); y } fp1 fprintf(fp2, ”¥n”); } A[2][5] fclose(fp2); fp2 return 0; } (^_^) w w smile.txt 【使用例 3/5】 個数がわからない整数データを ファイルの終わりまで読み込みながら表示する #include <stdio.h> int main(void) { FILE *fp; int num; fp = fopen(”intfile.dat”, ”r”); while(fscanf(fp, ”%d”, &num) != EOF){ printf(”%d¥n”, num); } fclose(fp); return 0; } ファイルを最後まで読み終えるまで whileループを実行する 【使用例 4/5】 個数がわからない文字データを ファイルの終わりまで読み込みながら表示する #include <stdio.h> int main(void) { FILE *fp; int ch; 文字データだが int 型を使おう fp = fopen(”textfile.txt”, ”r”); while(fscanf(fp, ”%c”, &ch) != EOF){ printf(”%c”, ch); } fclose(fp); return 0; } この例では 改行しないで 単にコピー 【使用例 5/5】 個数がわからない文字列データを ファイルの終わりまで読み込みながら表示する #include <stdio.h> int main(void) { FILE *fp; char str[256]; fp = fopen(”textfile.txt”, ”r”); while(fscanf(fp, ”%s”, str) != EOF){ printf(”%s¥n”, str); } fclose(fp); return 0; } 配列なので &を付けない
© Copyright 2024 ExpyDoc