C++ファイル入出力ストリーム+入出力バイナリファイル(カスタムオブジェクト)

4039 ワード

ファイルフロークラスとファイルフローオブジェクト
ファイルストリームは、外部ファイルを入出力オブジェクトとするデータストリームです.
出力ファイルストリームメモリ->外部メモリ
ファイルストリームの外部メモリの入力->メモリ
 
ファイルフロークラス
ストリームの名前
流れの作用
ifstreamクラス
istreamクラスから派生し、ディスクファイルからの入力をサポート
ofstreamクラス
OStreamクラスから派生し、ディスクファイルへの出力をサポート
fstreamクラス
iostreamクラスから派生し、ディスクファイルの入出力をサポート
 
 
操作:
ファイルを開く:
1、ファイルストリームのメンバー関数openを呼び出します.のように
ofstream outfile;
outfile.open("f1.dat",ios::out);
2、ファイルフローオブジェクトを定義するときに指定したパラメータは、ファイルフロークラスを宣言するときにパラメータ付き構造関数を定義し、ディスクファイルを開く機能を含む.
ostream outfile("f1.dat",ios::out);
 
入出力フォーマット:
ios::in
入力でファイルを開く
ios::out
ファイルを出力で開きます(これはデフォルトです).この名前のファイルがある場合は、元の内容をすべてクリアします.
ios::app
出力でファイルを開き、書き込みデータをファイルの末尾に追加
ios::ate
既存のファイルを開き、ファイルポインタがファイルの末尾を指します.
ios: :trunc
ファイルを開き、ファイルがすでに存在する場合は、ファイルが存在しない場合は新しいファイルを作成するなど、すべてのデータを削除します.ios::out方式が指定され、ios::app、ios::ate、ios::inが指定されていない場合は、この方式をデフォルトに設定します.
ios::binary
ファイルをバイナリ形式で開きます.この形式を指定しない場合、デフォルトはASCII形式です.
ios::nocreate
既存のファイルを開きます.ファイルが存在しない場合は、開けません.nocrcateは新しいファイルを作成しないことを意味します
ios::noreplace
ファイルが存在しない場合は新しいファイルを作成し、ファイルが存在する場合は操作に失敗します.replaceは既存のファイルを更新しないことを意味します.
ios::in l ios::out
入力と出力でファイルを開き、ファイルが読み書き可能になります.
ios::out | ios::binary
出力ファイルをバイナリで開く
ios::in l ios::binar
入力ファイルをバイナリで開く
 
注意点:
1)開くファイルごとに1つのファイルポインタがあり、そのポインタの初期位置はI/O方式で指定され、読み書きのたびにファイルポインタの現在位置から始まる.1バイト読み込むたびに、ポインタは1バイト後ろに移動します.ファイルポインタが最後に移動すると、ファイル終了EOF(ファイル終了子も1バイトを占め、値は-1)に遭遇し、ストリームオブジェクトのメンバー関数eofの値は0以外(一般的には1)であり、ファイルが終了したことを示す.
 
2)「ビットまたは」演算子「|」で入出力方式を組み合わせてもよいが、反発方式を組み合わせてはいけない
 
3)オープン操作に失敗した場合、open関数の戻り値は0(偽)であり、コンストラクション関数を呼び出してファイルを開いた場合、ストリームオブジェクトの値は0である.このテストに基づいて、正常に開いたかどうかをテストできます.のように
 
    if(!outfile.open("f1.bat", ios::app) )
        cout<
 
クラスオブジェクトをバイナリファイルに書き込み、読み込み
#include 
#include 
#include 

using namespace std;

class Data
{
private:
	int m_a;
	string m_b;
	float m_c; 
public:
	Data(int  a, string b, float c) :m_a(a), m_b(b), m_c(c){}
	void show()
	{
		cout << "m_a:" << m_a << " , m_b:" << m_b << " , m_c:" << m_c << endl;
	}
};

int main()
{
	/*  */
	ofstream out("myclass.dat", ios::app | ios::binary);
	
	if (out.is_open()!=true)
	{
		cout << "can not open myclass.dat " << endl;
		exit(1);
	}
	Data *dataArray[5];
	dataArray[0] = new Data(0, "hello0", 0.0);
	dataArray[1] = new Data(1, "hello1", 1.0);
	dataArray[2] = new Data(2, "hello2", 2.0);
	dataArray[3] = new Data(3, "hello3", 3.0);
	dataArray[4] = new Data(4, "hello4", 4.0);
	out.write((char *)dataArray[0], sizeof(*dataArray[0]));
	out.write((char *)dataArray[1], sizeof(*dataArray[0]));
	out.write((char *)dataArray[2], sizeof(*dataArray[0]));
	out.write((char *)dataArray[3], sizeof(*dataArray[0]));
	out.write((char *)dataArray[4], sizeof(*dataArray[0]));
	out.close();
	system("pause");
}

int  main1()
{
	/*  */
	ifstream in("myclass.dat", ios::binary);
	if (in.is_open() != true)
	{
		cout << "can not open" << endl;
		exit(0);
	}
	Data *dataArray[5] ;
	dataArray[0] = new Data(0,"",0);
	dataArray[1] = new Data(0, "", 0);
	dataArray[2] = new Data(0, "", 0);
	dataArray[3] = new Data(0, "", 0);
	dataArray[4] = new Data(0, "", 0);
	in.read((char *)dataArray[0], sizeof(*dataArray[0]));
	in.read((char *)dataArray[1], sizeof(*dataArray[0]));
	in.read((char *)dataArray[2], sizeof(*dataArray[0]));
	in.read((char *)dataArray[3], sizeof(*dataArray[0]));
	in.read((char *)dataArray[4], sizeof(*dataArray[0]));
	(*dataArray[0]).show();
	(*dataArray[1]).show();
	(*dataArray[2]).show();
	(*dataArray[3]).show();
	(*dataArray[4]).show();
	in.close();
	system("pause");
}