fp1

第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;
}
配列なので
&を付けない