none
CArchive::ReadString(CString& rString) の戻り値 RRS feed

  • 質問

  • こんにんちは。

    VC++2003にてMFCアプリケーションを開発しております。

    開発&動作環境は WindowsXP Pro SP1 です。

     

    CArchive::ReadStringの動作について疑問を感じる箇所がありましたので,投稿いたします。

     

    以下の条件を満たす場合,CArchive::ReadString(CString& rString)の戻り値がFALSEになってしまいます。

    ①テキストファイルの最終行であり,改行コードが無い。

    ②最終行が丁度128Byteである

     

     

    以下に再現手順を示します。

    ① カレントディレクトリに3つのテキストファイルを作成します。

     1.1 『127Byte.txt』 ・・・127文字の半角英数で改行なし(1行だけ)

     1.2 『128Byte.txt』 ・・・128文字の半角英数で改行なし(1行だけ)

     1.3 『129Byte.txt』 ・・・129文字の半角英数で改行なし(1行だけ)

     

     

    ② WIN32コンソールアプリケーションを作成,以下の関数を追加し,

     _tmain にて test() を呼び出します。

     

    ==========add functions ============================

    BOOL read_file_test(const CString& sFilePath)
    {
       CFile file(sFilePath, CFile::modeRead) ;
       CArchive ar(&file, CArchive::load) ;
       CString sLine;
       BOOL bResult = ar.ReadString(sLine);
       ar.Close() ;
       file.Close() ;
       return bResult;
    }


    void test()
    {

      // 127 BYTE
       { 
          BOOL bResult = read_file_test("127Byte.txt"); // <<< RETURN "TRUE"
          afxDump << "*** 127 ... Result = " << bResult << "\n"; 
       }

       // 128 BYTE
       { 
          BOOL bResult = read_file_test("128Byte.txt"); // <<< RETURN "FALSE"
          afxDump << "*** 128 ... Result = " << bResult << "\n";
       }

       // 129 BYTE
       { 
          BOOL bResult = read_file_test("129Byte.txt"); // <<< RETURN "TRUE"
          afxDump << "*** 129 ... Result = " << bResult << "\n";
       }
    }

    =================end of add ========================

     

    上記コードによりますと,128BYTEの場合だけ,FALSEが戻されてしまいます。

     

     

    MFC内部までデバッガで追いかけていきますと,

    CArchive::ReadString(CString& rString)内部で

    CArchive::ReadString(LPSTR lpsz, UINT nMax)をnMax を-128として呼び出しています。

     

    ブラックボックス的に見て動作が不思議なのはもちろんですが,

    CArchive::ReadString(CString& rString)のコードを眺めてみても,

    NEWLINE(\n)が無い場合でnMaxの場合の処理ができないような気がいたします。

     

     

    どなたかご存知の方がいらっしゃいましたら,教えていただければ幸いです。

    ★ 私の誤りでしたら,その旨ご指摘いただけるとありがたいです。 

     

     

    2006年4月24日 7:49