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に戻る