ファイル処理

C++におけるファイル処理について解説します。Cと比べてC++のファイル処理はオブジェクトになっています。そのため、ファイル処理の部品を一つにまとめることができ、プログラムにまとまりがでてきます。ここでは、具体的にはテキストファイルの入出力とバイナリファイルの入出力を解説します。

テキストファイルの読み書き

では、テキストファイルをつくって読み取るプログラムをつくります。

#include <iostream>
#include <fstream>
using namespace std;

int main(){
	//test.txtファイルをつくる
	ofstream fout("test.txt");
	if(!fout){
		cout<<"エラー";
		return 1;
	}
	fout << "test\n";	//testを保存する
	fout.put('a');	//1文字を保存
	fout.put('\n');
	fout.close();

	//test.txtファイルを開く
	ifstream fin("test.txt");
	if(!fin){
		cout<<"エラー";
		return 1;
	}
	char str;
	char strs[100];
	//1行表示
	fin>>strs;
	cout<<strs;
	//1文字ずつ読む
	while(fin.get(str)){ //読み取れなくなったらfalseをかえす
		cout<<str;
	}
	fin.close();
	
	return 1;
}

C++のファイル処理を使用するには

#include <fstream>

でインクルードする必要があります。はじめに、ファイルをつくるために

ofstream fout(“test.txt”);

でストリームをつなげています。ここで、ストリームをつなげるのに失敗するとfoutが偽になりエラーを判断できます。次に、

fout<<“test\n”;

でfoutに文字を保存しています。また、put(‘a’)を使って一文字ずつの保存も可能です。読み込みも同様に

ifstream fin(“test.txt”);

でストリームをつなげます。そして、

fin>>strs;

でstrsに文字列を一行読み取ります。ここではstrsにtest\nが入ったことになります。そして、get(str);により一文字ずつ読み取っていきます。この命令は読み取れなくなるとtrueを返します。

バイナリファイルの読み書き

バイナリファイルの読み書きも同じように行うことができます。

#include <iostream>
#include <fstream>
using namespace std;

int main(){
	//testファイルをつくる
	ofstream fout("test",ios::binary);
	if(!fout){
		cout<<"エラー";
		return 1;
	}
	int a=100;
	fout.write((char *)&a,sizeof(int));
	fout.close();

	//testファイルを開く
	ifstream fin("test",ios::binary);
	if(!fin){
		cout<<"エラー";
		return 1;
	}
	int b;
	fin.read((char *)&b,sizeof(int));
	cout<<b;
	fin.close();

	return 1;
}

バイナリ形式で保存する場合は、

ofstream fout(“test”,ios::binary);

のようにios::binaryと指定します。この指定で使える演算子としては

  • ios::app  ファイルへの出力がファイルの末尾に付加する
  • ios::ate  ファイルを開くときにファイル末尾までシークする
  • ios::in   ファイルが入力可能
  • ios::out  ファイルが出力可能
  • ios::trunc 同名のファイルが存在するなら破棄する

があります。これらの値はOR「|」により組み合わせが可能です。書き込む際には

write((char *)&a,sizeof(int));

で行います。ポインタはchar型に変換し、変数のサイズを指定します。ここでは変数のサイズはint型のサイズです。

読み込みも同じようにifstreamにios::binaryを付けて呼び、

read((char *)&b,sizeof(int));

で読み込みます。

著者:安井 真人(やすい まさと)