Chapter 10

ファイル処理

Nanase
Nanase
2020.12.20に更新

ファイルのOpen処理

【../../Pref.txtの意味】

【テキストファイル】

FILE *fp1, *fp2;
fp1 = fopen("../../Pref.txt", "r");
fp2 = fopen("../../Pref.txt", "w");

【バイナリファイル】

FILE *fp1, *fp2;
fp1 = fopen("../../Pref.txt", "rb");
fp2 = fopen("../../Pref.txt", "wb");

【Openエラー処理は必ずコーディングする】

fp1 = fopen("../../Pref.txt", "r");
if(fp1 == NULL){
  printf("File(fp1) open error\n");
  return 1;
}

【実行時(デバック時)Openエラーの原因】

① そのファイルがProg2のフォルダーの中に存在しない。ファイルをコピー(保存)する場所を間違った等。
② ソースプログラムの記述ミス。
例)単純な記述ミス

Pref.txt -> pref.txt
Pref.txt -> Pref .txt ←ピリオドの前にスペースがある
pref.dat -> pref.txt

③ プログラムがProg2配下のプロジェクト以外の箇所で作成されている。

テキストファイルかバイナリファイルか

【テキストファイル】

FILE *fp1, *fp2;
fp1 = fopen("../../Pref.txt", "r")
fp2 = fopen("../../Prefout.txt", "w")

①各行(データ)に同じ揃いの値が格納されている場合

char name[10]; int pop; double den;
fscanf(fp1, "%s %d %lf", name, &pop, &den);
fprintf(fp2, "%s %d %lf", name, pop, den);

②各行(データ)に不揃いの文字列が複数格納されている場合

char str[256]; 
fgets(str, 256, fp1);
fputs(str, fp2);

【バイナリファイル】

FILE *fp1, *fp2;
fp1 = fopen("../../Pref.txt", "rb");
fp2 = fopen("../../Prefout.txt", "wb");
char name[10]; int pop; double den;
fread(name, sizeof(char), 10, fp1);
fread(&pop, sizeof(int), 1, fp1);
fread(&den, sizeof(double), 1, fp1);
fwrite(name, sizeof(char), 10, fp2);
fwrite(&pop, sizeof(int), 1, fp2);
fwrite(&den, sizeof(double), 1, fp2);

データ件数が既知か未知か

【既知の場合】

int n=47;
for(i=0; i<n; i++){
  fscanf・・・
}

【未知の場合】(無限ループでファイルを読む)

無限ループの場合、データを読み込んだ直後、feofをチェックします。
テキストファイル

while(1){
  fscanf・・・
  if(feof(fp)){
    break;
  }
}

バイナリファイル

while(1){
  fread(&a, sizeof(int), 1, fp);
  fread(str, sizeof(char), 10, fp);
  if(feof(fp)){
    break;
  }
}