タイトル

File操作

タイトル

1,CFile
2,CStdioFile
3,CArchive
4,iniファイル

1,CFile

CFileクラスはファイル操作を行う低水準のクラスです。
低水準なのでファイルの細かな操作が行えます。
ファイルの操作は次のように行います。

Open
ファイルの操作
Close

読み込み

ファイルの読み込みは、Read関数を使います。
たとえばRead(buf,1024) ではbuf変数に1024バイトを
読みとるというものです。


書き込み

書き込みにはWrite関数を使います。
Write(buf,1024) ではbuf変数内のデータを
1024バイト書き込みます。

クラス メッセージ メンバ関数
CNamaeView 左ボタンがダブルクリック OnLButtonDblClk

void CNamaeView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	CFile a,b;
	int n;
	char buf[1024];
	a.Open("a:\\test.log",CFile::modeRead);
	b.Open("a:\\test2.log",CFile::modeCreate|CFile::modeWrite);

	while((n=a.Read(buf,1024))!=0)
		b.Write(buf,n);


	CView::OnLButtonDblClk(nFlags, point);
}

オブジェクトaはコピーもとのファイル、bはコピー先のファイルです。
a.Read(buf,1024) でbufに1024バイト代入されます。
戻り値は実際に読み込んだファイル数です。
ファイルの終わりの方では1024バイト読みとれません。

b.Write(buf,n) でファイルの書き込みをします。
ここでは、buf変数のうち、nバイトを実際に書き込みます。

上上へ


2,CStdioFile

CStdioFileはCFileの派生クラスです。
したがって、CFileクラスの操作に加えてCStdioFile特有の操作ができます。
命令はコントラスタと以下の2つしかありません。

ReadString

ファイルから1行分のデータを読みとります。
「1行分」というのは、改行コード「CR・LF」まで読みとるということです。
文字変数の最後には¥0が自動的に補われます。

この関数は、テキストデータのやりとりなどが便利です。
以下は、HPの「index.html」というカレントディレクトリにある
ファイルを読みとって表示するプログラムです。

クラス 関数
CNamaeView OnDraw

void CNamaeView::OnDraw(CDC* pDC)
{
	CNamaeDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CStdioFile fp("index.html",CFile::modeRead);
	char buf[300];
	int n=0;
	while (fp.ReadString(buf,300)!=NULL)
		pDC->TextOut(0,(n++)*20,buf,strlen(buf)-1);
}

これは、buf変数にファイルの文字データを格納します。
ReadStringでは、CR+LFの組み合わせで読みとりを中止するのですが
CRは変数内に取り込まれてしまいます。
そこで、strlen(buf)-1 で最後の1文字分を表示しないようにしています。

ReadString

WriteString

文字変数に蓄えられているデータを¥0までファイルに書き込みます。
ただし、文字変数の終わりを意味する「¥0」はファイルに書き込まれません。
改行を意味する「¥n」はCR・LFに変換されます。

クラス 関数
CNamaeView OnDraw

void CNamaeView::OnDraw(CDC* pDC)
{
	CNamaeDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CStdioFile fp("a:\\test.log",CFile::modeCreate|CFile::modeWrite);
	char buf[30];

	strcpy(buf,"宇宙・物理研究室\n");
	fp.WriteString(buf);

	strcpy(buf,"http://www.win.or.jp/~ael/\n");
	fp.WriteString(buf);
}

これを実行すると「test.log」というファイルが作られます。 これを「メモ帳」などで開いてみると

宇宙・物理研究室
http://www.win.or.jp/~ael/

のようになっています。

上上へ


3,CArchive

CFileクラスとは別のクラスでバイナリデータを扱います。
変数の値やCString型の文字変数を格納するのに非常に便利なので
変数をファイルとやりとりする場合は通常この方法を使います。
この関数を使って次の変数の型のやりとりができます。

使用バイト数 意味
BYTE 8 bit 0〜  255 整数 符号なし
WORD 16bit 0〜65535 整数 符号なし
LONG 32bit −21億から21億 整数 符号あり
DWORD 32bit 0〜43億 整数 符号なし
float 32bit 実数
double 64bit 実数
CString 可変 文字型
CPoint 可変 ポイント型

データの出力

データの出力の例を示します。

クラス メンバ関数
CNamaeView Onwrite

void CNamaeView::Onwrite() 
{
	//以下は適当な変数の例
	BYTE a=96;
	double b=3.14159;
	CString c("Visual C++");

	//これよりファイルへの書き込み
	CFile fp("a:\\test.log",CFile::modeCreate|CFile::modeWrite);
	CArchive ar(&fp,CArchive::store);
	ar<<a;
	ar<<b;
	ar<<c;
	ar.Close();
}

最初にBYTE,double,CString型の変数を用意しています。

ファイルの操作はCFileでOPENしたのち、CArchiveでarを宣言しておきます。
あとは、ar<<(変数) でファイルに変数が格納されていきます。


データの入力

データの出力の例を示します。

クラス メンバ関数
CNamaeView Onread

void CNamaeView::Onread() 
{
	BYTE a;
	double b;
	CString c;

	//これよりファイルから読み込み
	CFile fp("a:\\test.log",CFile::modeRead);
	CArchive ar(&fp,CArchive::load);
	ar>>a;
	ar>>b;
	ar>>c;
	ar.Close();
}

ar>>(変数)で変数にファイルからのデータを格納することができます。

先ほどのファイルをこれでREADしてみてください。
デバッグモードでbreakポイントを関数の最後に指定して
「クイックウォッチ」でみると確かに各変数に
先ほどのデータが格納されていたことがわかります。

上上へ


4,設定ファイル

エクスプローラなどでWindowsのディレクトリーをみると「ini」ファイルというものがあります。
「iniファイル」は「設定ファイル」とも呼ばれWindowの大きさや
位置、ユーザの情報など、アプリケーションの設定で記録したいものが
記録できます。
iniファイルはWindowsのディレクトリにできます。
では、書き込む場合を考えてみます。

クラス メッセージ 関数
CNamaeView 右ボタンが押された OnRButtonDown

void CNamaeView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	int a=123;
	CString b("小林");
	AfxGetApp()->WriteProfileString("test","mozi",b);
	AfxGetApp()->WriteProfileInt("test","int",a);

	CView::OnRButtonDown(nFlags, point);
}

WriteProfileInt 関数を実行するとWindowsディレクトリにNamae.ini ファイルが
できます。WriteProfileInt はINT型の文字が書き込めます。
WriteProfileString 関数では、文字型が書き込めます。
いずれも3つの引数が必要です。これを実行するとiniファイルは


[test]
mozi=小林
int=123

第1番目の引数が[ ]の部分になります。

さて、右クリックで値を記録できたので、左クリックで読み出すことにします。

クラス メッセージ 関数
CNamaeView 左ボタンが押された OnRButtonDown

void CNamaeView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	int a;
	CString b;
	b=AfxGetApp()->GetProfileString("test","mozi","");
	a=AfxGetApp()->GetProfileInt("test","int",0);
	
	CView::OnRButtonDown(nFlags, point);
}

GetProfileString か GetProfileInt を使うことによって
INI型かCString型のデータを読み出せます。
第3番目の引数は、読み出しに失敗したときのデフォルトの値です。


戻るC++のPageに戻る