![]()
![]()
| 1,CFile |
| 2,CStdioFile |
| 3,CArchive |
| 4,iniファイル |
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バイトを実際に書き込みます。
CStdioFileはCFileの派生クラスです。
したがって、CFileクラスの操作に加えてCStdioFile特有の操作ができます。
命令はコントラスタと以下の2つしかありません。
ファイルから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文字分を表示しないようにしています。
文字変数に蓄えられているデータを¥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/
のようになっています。
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ポイントを関数の最後に指定して
「クイックウォッチ」でみると確かに各変数に
先ほどのデータが格納されていたことがわかります。
エクスプローラなどで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に戻る