第八回(ファイル操作)


ファイル操作

ファイル操作とは、実行ファイルとは別にあるファイルからデータを持ってくることや、ファイルに何かを出力したりすることです。

ファイルポインタ

ファイルポインタとは名前のとおり、ファイルをさすポインタのことです。型はFILEです。これを使うことで、テキストファイルでもバイナリファイルでもさすことができます。

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

テキストファイルはパソコンを使うときにそのまま、そのまま文字として見れるファイルのことです。メモ帳で開けるのがこちらです。こちらのファイル操作を説明します。
バイナリファイルとは0と1の羅列でデータが格納されたファイルのことをさします。こちらもC言語で操作できますが、ゼミでは割愛させてもらいます。

fopen

ファイルを開くことができる関数です。ファイルのデータがあるところのアドレスを返してくれます。エラーが出ると、NULLを返します。
関数の形式はfopen(ファイル名, ファイルの指定モード)です。

ファイルの指定モード 説明
"r" ファイルを読みこむときに使います。
"w" ファイルへ書きこむときに使います。元々ファイルにデータがあった場合、上書きします。ファイルがないとEOFを返します。
"a" ファイルへ追加書き込みするときに使います。ファイルがないとファイルを新規作成します。
"r+" "r""w"の効果がありますが、ファイルがないとEOFを返します。
"w+" "r""w"の効果がありますが、ファイルがないとファイルを新規作成します。
"a+" "r""a"の効果があります。ファイルがないとファイルを新規作成します。
fclose

ファイルを閉じるときに必要です。

ファイルの流れ

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);
}
data.txt
水道水はタダで飲み放題!
実行例
水道水はタダで飲み放題!

次にプログラムで入力した内容をファイル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キャッチャーは貯金箱であると。
output.txt
偉い人は言いました。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);
}
実行例
「あいうえお」
「かきくけこ」
返答:さしすせそ
test.txt(はじめ)
あいうえお
かきくけこ
test.txt(実行後)
さしすせそ

基本問題

ファイルをプログラム内で1回だけ開き、ファイルの中身をすべて表示した後、好きな文字を入力してその文字列をファイルの最後に追記できるプログラムを作成してください。

以下は実行例です。

ファイル(実行前)
Ritsumeikan
1度目の実行
> Ritsumeikan
追記: Computer
ファイル(1度目の実行後)
Ritsumeikan
Computer
2度目の実行
> Ritsumeikan
> Computer
追記: Club
ファイル(2度目の実行後)
Ritsumeikan
Computer
Club

応用問題

1つのデータが3つ以上のメンバ変数(名前、年齢、身長など)を持つ構造体を定義して、以下の機能を持つプログラムを作成してください。

最終課題

今までに習った知識を使って、何かを作成してください。
もちろん単純なものでも構いませんが、できればそれなりに頑張って作ってほしいです。
期限は一応、夏季休暇終了までとしますが、別にそれ以降に出してもらっても構いません。

戻る