C++スコーラ

ファイル入出力

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可
今回はファイル入出力です。 
今までコンソール画面(黒い背景に白文字の画面)に文字を出したり、
画面上に入力されたもの(数値など)から情報を受け取ったりしていました。
同じことをメモ帳などで見ることのできるテキストファイルで行います。
画面に書かれた文字は画面が消えてしまえば(プログラムが終了してしまえば)、
そのまま消えてしまいますがファイルに書かれたことはファイルが削除されない限り残っています。

文字の書きこみ

ファイル入出力を行うには最低限必要な工程が3つあります。
1.ファイルを開く…すでにあるファイルを開くか、新しいファイルを作って開きます。
2.ファイルの内容を読み書き…今まで画面で行っていた処理をファイルで行います。
3.ファイルを閉じる…開いたファイルは操作が終わったら閉じなくてはいけません。
さらにどのファイルを操作するのか指定するために、FILE型ポインターにファイルのアドレスを格納します。
通常はファイルを開くときに同時に行います。
	FILE* pFile = fopen("test.txt","w"); //ファイルを開くと同時にFILE型ポインターにアドレスを格納

	fprintf(pFile,"テスト[[文字列]]"); //ファイルに文字列を書きこむ

	fclose(pFile); //ファイルを閉じる
実行しても画面には何も表示されません。
いったんプログラムを終了して今回作ったプログラムの sln が保存されているフォルダを開きます。
(スタートボタン→コンピュータ→ドキュメント→Visual Studio 2010→Projects→今回作ったプログラムのフォルダ)
上記( )の手順は使っているPCなどによって違う場合があります。
test.txt というファイルがあるのでそれを開いてください。
この test.txt は fopen関数によって新しく作られたファイルです。
fopen関数はファイルを開く(作る)とそのファイルのアドレスを戻り値として返してきます。
失敗した場合は 0 を返してきます。

"w" については次の項で説明します。
ファイルを開くと「テスト文字列」と書いてあります。
この文字列は fprintf関数によって書かれたものです。
fprintf関数 は文字列の情報だけでは、ファイルに文字を書きこめません。
どのファイルに書きこむのかファイルのアドレスを渡す必要があります。
アドレスは FILE型ポインターによって渡します。
ファイル入出力系の操作をするときは、基本的に、どのファイルに対する操作なのか指定する必要があります。
最後に、fclose関数によってファイルを閉じます。この時もファイルのアドレスを渡す必要があります。
ファイルは処理や操作が終わったら必ず閉じるようにしましょう。

※練習問題
 第1問
 tomatoes.txt というファイルを開き(作り)、「トマトは赤いです。」と書きこむ。

 第2問
 ユーザーに二つ数値を入力してもらい、合計をファイルに書きこんで保存する。

 ヒント:fprintf関数は今まで使っていたある関数と同じように使えます。

オープンモードの指定

前項でファイルを開くとき fopen("test.txt","w"); と書いていました。
この "w" はモードの指定になります。
ファイルをどのような目的で使うのかによってモードを変えます。
"w"…書き込み専用
開いたファイルに何か書いてある場合はすべて消してしまいます。
指定されたファイル名のファイファイルが存在しない場合は新規作成します。
	FILE* pFile = fopen("Hello.txt","w");

	fprintf(pFile,"HelloWorld!!");

	fclose(pFile);
実行したら Hello.txt を開いてみてみましょう。
"a"…追加書き込み
開いたファイルに何か書いてある場合はその後ろから書きこみを行います。
指定されたファイル名のファイファイルが存在しない場合は新規作成します。
	FILE* pFile = fopen("Hello.txt","a");

	for(int i = 0;i < 20;i++)
	{
		fprintf(pFile,"文字列の書きこみ成功[%d回目]\n",i);
	}

	fclose(pFile);
実行したら Hello.txt を開いて見てみましょう
さらにもう一度実行して見てみましょう
"r"…読み出し専用
ファイルがない場合は 0 を返す
	char szBuff[1024];
	
	FILE* pFile = fopen("Hello.txt","r");

	if(pFile != 0)
	{
		fgets(szBuff,1023,pFile);

		printf("%s\n",szBuff);

		fclose(pFile);
	}
	else
	{
		printf("ファイルオープンエラー\n");
	}
fgets関数は一行だけ読み込みます。
2行以上読み込みたい場合はもう一度使う必要があります。
	char szBuff[1024];
	
	FILE* pFile = fopen("Hello.txt","r");

	if(pFile != 0)
	{
		for(int i = 0; i < 10;i++)
		{
			fgets(szBuff,1023,pFile);

			printf("%s",szBuff);
		}

		fclose(pFile);
	}
	else
	{
		printf("ファイルオープンエラー\n");
	}
fgets(szBuff,1023,pFile); の部分を fscanf(pFile,"%s",szBuff); に変えてもう一度実行してみましょう。
fscanf関数は改行を読み込みません。 両方を使い分けましょう。
今回紹介したのは基本的な物です。
オープンモードはほかにもあるので気になる人は自分で調べてみましょう。
※練習問題
次のようなプログラムを作ってください。
  • 第1問
 doll.txt というファイルを開くかまたは新規作成して、中に

水銀燈
金糸雀
翠星石
蒼星石
真紅
雛苺
薔薇水晶
と書きこむ
seirei.txt というファイルを開くかまたは新規作成して、中に
メイメイ
ピチカート
スィドリーム
レンピカ
ホーリエ
ベリーベル
名称未設定1
と書きこむ

  • 第2問
 doll.txt と seirei.txt を読み込み、
 rozen.txt というファイルを開くかまたは新規作成して、中に
水銀燈
金糸雀
翠星石
蒼星石
真紅
雛苺
薔薇水晶
メイメイ
ピチカート
スィドリーム
レンピカ
ホーリエ
ベリーベル
名称未設定1
と書きこむ

  • 第3問
 doll.txt と seirei.txt を読み込み、
 rozen2.txt というファイルを開くかまたは新規作成して、中に
水銀燈	(メイメイ)
金糸雀	(ピチカート)
翠星石	(スィドリーム)
蒼星石	(レンピカ)
真紅	(ホーリエ)
雛苺	(ベリーベル)
薔薇水晶	(名称未設定1)
と書きこむ
ウィキ募集バナー