ファイル操作とは、実行ファイルとは別にあるファイルからデータを持ってくることや、ファイルに何かを出力したりすることです。
ファイルポインタとは名前のとおり、ファイルをさすポインタのことです。型はFILEです。これを使うことで、テキストファイルでもバイナリファイルでもさすことができます。
テキストファイルはパソコンを使うときにそのまま、そのまま文字として見れるファイルのことです。メモ帳で開けるのがこちらです。こちらのファイル操作を説明します。
バイナリファイルとは0と1の羅列でデータが格納されたファイルのことをさします。こちらもC言語で操作できますが、ゼミでは割愛させてもらいます。
ファイルを開くことができる関数です。ファイルのデータがあるところのアドレスを返してくれます。エラーが出ると、NULLを返します。
関数の形式はfopen(ファイル名, ファイルの指定モード)です。
ファイルの指定モード | 説明 |
"r" | ファイルを読みこむときに使います。 |
"w" | ファイルへ書きこむときに使います。元々ファイルにデータがあった場合、上書きします。ファイルがないとEOFを返します。 |
"a" | ファイルへ追加書き込みするときに使います。ファイルがないとファイルを新規作成します。 |
"r+" | "r"と"w"の効果がありますが、ファイルがないとEOFを返します。 |
"w+" | "r"と"w"の効果がありますが、ファイルがないとファイルを新規作成します。 |
"a+" | "r"と"a"の効果があります。ファイルがないとファイルを新規作成します。 |
ファイルを閉じるときに必要です。
fopen関数で動的にメモリ確保をして、fclose関数でそのメモリ領域を開放しています。
ファイル操作で使う関数です。終了条件とはwhileでファイルの内容を取得するときの終了条件です。
(そのため、出力系には///としています。)
関数名 | 説明 | 終了条件 |
fgets | 今までstdinが入っていた場所にファイルポインタの変数を渡して、ファイルから1行ずつchar型の配列に出力する。 | NULL |
fgetc | ファイルポインタの変数を渡すと、返り値として1文字ずつファイルの中身を出力する。 | EOF |
fputs | 文字列とファイルポインタの変数を渡すとファイルへ1行出力することができます。 | //////// |
fputc | 文字とファイルポインタの変数を渡すと、ファイルへ1文字出力することができます。 | //////// |
fprintf | fprintf(ファイルポインタの変数, printf関数の書式);です。printfの書式で普段、標準出力(表示)される文字列がファイルへ出力されます。 | //////// |
では実際の例をみてみましょう。
まずは、data.txtの中身を読みこんで表示するプログラムです。
#include<stdio.h> #define MAX 256 int main(void){ FILE *fp; //ファイルポインタ char str[MAX] = {0}; //初期化 int i = 0; if((fp = fopen("data.txt", "r")) == NULL){ //ファイルを開いて同時にエラー処理 printf("error\n"); return(-1); //エラーが出る場合は0ではなく、-1を返す。 } //ファイルからデータを1文字ずつ格納 while((str[i] = fgetc(fp)) != '\n'){ i++; if(i >= MAX)break; } printf("%s", str); //表示 fclose(fp); //ファイルを閉じる return(0); }
水道水はタダで飲み放題!
水道水はタダで飲み放題!
次にプログラムで入力した内容をファイルoutput.txtに書きこむプログラムの例です。
#include<stdio.h> #define MAX 256 int main(void){ FILE *fp; //ファイルポインタ char str[MAX]; if((fp = fopen("output.txt", "w")) == NULL){ //ファイルを開いて同時にエラー処理 printf("error\n"); return(-1); } printf("> "); fgets(str, MAX, stdin); fprintf(fp, "%s", str); //ファイルへ出力する。 fclose(fp); //ファイルを閉じる return(0); }
> 偉い人は言いました。UFOキャッチャーは貯金箱であると。
偉い人は言いました。UFOキャッチャーは貯金箱であると。
最後にファイルからデータを読みこんで、書き変えて上書きするプログラムの例です。
#include<stdio.h> #define MAX 256 int main(void){ FILE *fp; char str[MAX]; if((fp = fopen("conver.txt", "r")) == NULL){ printf("error\n"); return(-1); } //1行ずつchar型の配列へ格納 while(fgets(str, MAX, fp) != NULL){ sscanf(str, "%s\n", str); printf("「%s」\n", str); } fclose(fp); if((fp = fopen("conver.txt", "w")) == NULL){ printf("error\n"); return(-1); } printf("返答:"); fgets(str, MAX, stdin); fprintf(fp, "%s", str); //ファイルへ出力する。 fclose(fp); //ファイルを閉じる return(0); }
「あいうえお」 「かきくけこ」 返答:さしすせそ
あいうえお かきくけこ
さしすせそ
ファイルをプログラム内で1回だけ開き、ファイルの中身をすべて表示した後、好きな文字を入力してその文字列をファイルの最後に追記できるプログラムを作成してください。
以下は実行例です。
Ritsumeikan
> Ritsumeikan 追記: Computer
Ritsumeikan Computer
> Ritsumeikan > Computer 追記: Club
Ritsumeikan Computer Club
1つのデータが3つ以上のメンバ変数(名前、年齢、身長など)を持つ構造体を定義して、以下の機能を持つプログラムを作成してください。
今までに習った知識を使って、何かを作成してください。
もちろん単純なものでも構いませんが、できればそれなりに頑張って作ってほしいです。
期限は一応、夏季休暇終了までとしますが、別にそれ以降に出してもらっても構いません。