CFile クラスによるファイル入出力
CFile は、ファイルに関する MFC の基本クラスです。
このクラスは、バッファを介さない、バイナリ ディスクへの入出力、
派生クラスを使ったテキスト ファイルやメモリ ファイルを間接的に操作します。
【ファイルを開く】
[書式]
virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL );
[戻り値]
開かれた場合は 0 以外を返します。開かれなかった場合は 0 を返します。
引数 pError は、0 が返されたときにだけ意味を持ちます。
[引数]
lpszFileName:
目的とするファイルへのパスを表す文字列を指定します。
相対パス、絶対パス、またはネットワーク名 (UNC) を指定できます。
nOpenFlags:
ファイルの共有モードとアクセス モードを定義する UINT を指定します。
OR (|) 演算子を使ってオプションを組み合わせることができます。
(備考)ファイル・アクセス・モード一覧
【ファイルを読み込む】
[書式]
virtual UINT Read( void* lpBuf, UINT nCount );
throw( CFileException );
[戻り値]
バッファに転送されたバイト数を返します。
ファイルの終わりに到達したときの戻り値は nCount よりも小さくなります。
[引数]
lpBuf:
読み出データを受け取るための、領域へのポインタ。
nCount:
ファイルから読み出す最大バイト数です。
テキスト ファイルでは、キャリッジリターンとラインフィードの組は、1 文字と数えます。
【ファイルへ書き込み】
[書式]
virtual void Write( const void* lpBuf, UINT nCount );
throw( CFileException );
[引数]
lpBuf:
ファイルに書き込むためのデータを保持した領域へのポインタ。
nCount:
バッファから転送されるバイト数を指定します。
テキスト ファイルでは、キャリッジリターンとラインフィードの組は、1 文字と数えます。
【ファイル・ポインタの移動】
[書式]
virtual LONG Seek( LONG lOff, UINT nFrom );
throw( CFileException );
[戻り値]
正常終了 : ファイルの先頭からの新しいバイト オフセット
異常終了 : 戻り値は定義されず、CFileException オブジェクトがスロー
[引数]
lOff:
ポインタを移動するバイト数。
nFrom:
ポインタの移動モードを指定
CFile::begin
ファイルの先頭から lOff バイト前方に移動
CFile::current
ファイルの現在位置から lOff バイト移動
CFile::end
ファイルの最後から lOff バイト移動
(注意)先頭方向へ移動するときは負の値を設定しなければならない。
正の値のときはファイルの終わりを越えて移動します。
[参考]
SeekToBegin : ファイル ポインタをファイルの先頭に移動
SeekToEnd : ファイル ポインタをファイルの最後に移動
【サンプル】
//CFileを使用してファイルを順次に読み込みます。
void CVc_cfileDlg::OnButton1()
{
CString FName;
CFile fobj;
CFileException err;
char strBuf[20];
//ファイル名を指定(自身の環境に合わせてPathを変更して下さい)
FName="C:\\Temp\\テスト用ファイル.txt";
//ファイルを開く
if(!fobj.Open(FName, CFile::modeRead, &err)){
#ifdef _DEBUG
afxDump << "File could not be opened " << err.m_cause << "\n";
#endif
return;
}
//内容の読み込み
strncpy(strBuf, "", 20);
UINT nReadByte = fobj.Read(&strBuf, 17);
while(nReadByte == 17){
TRACE("%s", strBuf);
strncpy(strBuf, "", 20);
nReadByte = fobj.Read(&strBuf, 17);
}
TRACE("%s", strBuf);
//ファイルを閉じる
fobj.Close();
}
//ファイル・ポインタを移動して途中から読み込む
void CVc_cfileDlg::OnButton2()
{
CString FName;
CFile fobj;
CFileException err;
char strBuf[20];
//ファイル名を指定(自身の環境に合わせてPathを変更して下さい)
FName="C:\\Temp\\テスト用ファイル.txt";
//ファイルを開く
if(!fobj.Open(FName, CFile::modeRead, &err)){
#ifdef _DEBUG
afxDump << "File could not be opened " << err.m_cause << "\n";
#endif
return;
}
//ファイル・ポインタを移動
fobj.Seek(17 * 3, CFile::begin); //先頭から三行分飛ばす
//内容の読み込み
strncpy(strBuf, "", 20);
UINT nReadByte = fobj.Read(&strBuf, 17);
//途中から読み込む
while(nReadByte == 17){
TRACE("%s", strBuf);
strncpy(strBuf, "", 20);
nReadByte = fobj.Read(&strBuf, 17);
}
TRACE("%s", strBuf);
//ファイルを閉じる
fobj.Close();
}
//データをファイルへ保存
void CVc_cfileDlg::OnButton3()
{
CString FName;
CFile fobj;
CFileException err;
//ファイル名を指定(自身の環境に合わせてPathを変更して下さい)
FName="C:\\Temp\\保存テスト用ファイル.txt";
//ファイルを開く
if(!fobj.Open(FName, CFile::modeCreate | CFile::modeWrite, &err)){
#ifdef _DEBUG
afxDump << "File could not be opened " << err.m_cause << "\n";
#endif
return;
}
fobj.Write("Test Data-1\n", 12);
fobj.Write("Test Data-2\n", 12);
fobj.Close();
}