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();
}