数値,文字列といったファイル中のデータを読み込んで(入力して)計算する,計算したデータをファイルに書き出し(出力し)たい場合は多くある.
ここではファイル入出力について学ぶ.
では実際のプログラムを見てファイル入出力を理解しよう.
example11-1.c はテキストファイル
sample_data.txt 内の一列に並んだ数値を読み取り,その総和を表示するプログラムである.
#include <stdio.h> int main(){ //ファイル変数(構造体)へのポインタを宣言 FILE *fp_in; double sum=0.0; double temp; //ファイルを読み込みモードで開く fp_in = fopen("./sample_data.txt","r"); //ファイルオープンに失敗した場合 if(fp_in==NULL){ //失敗と表示し終了 printf("ファイルオープンに失敗しました\n"); //エラー終了の場合戻り値を0以外にする return 1; } //fscanfが正常終了する間読み込みを繰り返す. while( fscanf(fp_in, "%lf" , &temp) == 1 ) { sum+=temp; } //ファイルを閉じる fclose(fp_in); printf("ファイル内の数値の総和は%fです\n",sum); return 0; } |
ファイルの入出力のためにはまずFILE型のポインタを宣言する.
FILE *fp_in;
fp_in = fopen("./sample_data.txt","r");
ファイルを開くの失敗した場合 fopen() はNULL文字を返す,これを利用して上のプログラムではファイルが読み込めなかった場合は異常終了としてreturn 1 返すようにしている.
ファイルを "r" オプション指定で開いた状態であれば,fscanf関数を用いてファイルから一行読みとって数値を変数に保存することができる.
fscanfの使い方はscanfとほぼ同じであり,違いは fscanf(fp_in, "%lf" , &temp) からわかるように読み込みたいファイルのFILE型変数のアドレス(この場合 fp_in)を指定することだけである.
fscanf関数は2回,3回,4回,...,と繰り返し実行すると自動的にスペースで区切られたファイル内の次の列の値,同じ行に値がなくなれば2行目,3行目,4行目,...,を読み込む仕様になっており,戻り値は変数の値に代入した回数となる.
これを利用してプログラム内の while( fscanf(fp_in, "%lf" , &temp) == 1 ) では,fscanf(fp_in, "%lf" , &temp) の戻り値が1になる限り(読み込む値がある限り)
条件が真となるのでテキストファイルの最後までfscanfを繰り返す仕組みになっている.
一度開いたファイルは処理が終わったら必ず
fclose(fp_in);
にて閉じる必要がある.忘れがちなので注意すること.
example11-2.c はキーボードから正の値を読み込み,読み込んだ値とその値のlogの値を2列で指定のファイル名に書き出すプログラムである.
#include <stdio.h> #include <math.h> int main(void){ //ファイル変数(構造体)へのポインタを宣言 FILE *fp_out; char str[256]; double input; printf("ファイル名を入力してください\n"); scanf("%s",str); //ファイルを書き込みモードで開く fp_out = fopen(str,"w"); //ファイルオープンに失敗した場合 if(fp_out==NULL){ //失敗と表示し終了 printf("ファイルオープンに失敗しました\n"); //エラー終了の場合戻り値を0以外にする return 1; } while(1){ printf("正の値を入力してください\n"); printf("終了する場合は負の値または0を入力してください\n"); scanf("%lf", &input); if(input <=0 ) break; //ファイルに受け取った値とそのlogの値を書き出す. fprintf(fp_out, "%f %f\n",input,log(input)); } fclose(fp_out); return 0; } |
ファイルへのデータ書きだしは,さきほどfopen関数のオプションを "w" に変えるだけでOKである.
例えばプログラム内では scanf("%s",str) で文字配列としてファイル名を読み込み,FILE型ポインタ fp_outに対して,
とすることにより書き出すファイルを開いている.
書き出しのオプションについては新規ファイルを作成して(ファイル名が存在すれば上書して) 書き出す "w" 以外にも,
既存のファイルの最後に追加して書き出す "a" を使用することもできる.
書き出しオプションにてファイルを開いた状態であればfprintf関数を用いて値を書きだすことが可能である.
こちらも使い方はprintfとほぼ同じであるが,第一項に開いたファイルのFILE型のアドレスを追加する必要がある.
fscanf同様にfprintf関数は2回,3回,4回,...,と繰り返し実行すると, "\n"が末尾にあればファイル内2行目,3行目,4行目,...,に書き込む仕様になっている.