0

CFileを使用する場合、何らかの理由で、read()を呼び出すと、最初の呼び出しの後に0バイトが返されます。

CFile iniFile;
int bytesRead=0;
char buffer[_MAX_PATH]; 
if(iniFile.Open(iniDirFilename,CFile::modeRead)){
        bytesRead += iniFile.Read(buffer,_MAX_PATH); // read file path
        SaveDirectoryBox->SetWindowTextA(buffer);
        iniFile.Seek(bytesRead,CFile::begin); // reposition pointer

        int x =iniFile.GetLength();
        int y =iniFile.GetPosition();




        bytesRead += iniFile.Read(buffer,_MAX_PATH); // read subfile path
        subSaveDirectoryBox->SetWindowTextA(buffer);
        iniFile.Seek(bytesRead,CFile::begin); // reposition pointer
}

明らかにそれ以上であることがわかっている場合、ファイルの長さはわずか72バイトであることがわかります。nullで終了する文字列をたくさん保存しました。たとえば、「He​​llo」の場合、構築時にCFileクラスが最初のNULL文字を探し、それをファイルの終わりと呼んでいると思います。setLength()関数を使用しようとしましたが、エラーが発生します

ファイルの残りの部分を読み取るにはどうすればよいですか?

編集:

私のプロジェクトはASCIIでの書き込みを読み取るように設定されています。そしてファイルもASCIIで書かれています

4

1 に答える 1

1

終端文字列がゼロのファイルがある場合は、テキストではなくバイナリとして扱う必要があります。これは、文字列を最初から次の終端ゼロ文字まで読み取る可能な解決策の 1 つです。

    ULONGLONG iTotalBuffSize = 0;
    CFile iniFile(_T("TestFile.txt"), CFile::modeRead);

    iTotalBuffSize = iniFile.GetLength();

    TCHAR* pBuff = new TCHAR[(UINT)iTotalBuffSize];

    iniFile.Read(pBuff, (UINT)iTotalBuffSize);

    while(0 != *pBuff)
    {
        CString csText(pBuff);   // this is your n-th string
        TRACE(_T("%s\n"), csText);

        pBuff += csText.GetLength() + sizeof(TCHAR);
    }

コードを UNICODE アプリと ANSI アプリの両方で使用できるように、汎用テキスト マッピングを使用してこれを記述しました。

于 2012-05-22T21:40:48.457 に答える