CFile将数据读取到缓冲区

时间:2015-03-30 13:43:56

标签: c++ mfc

我正在尝试从文件中获取所有字节以读取BYTE *变量。我正在尝试将整个xml文件数据读入内存,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<DataBlock xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Device>3867242</Device>
    <Manufacturer>COMPANY LTD</Manufacturer>
    <Data>15</Data>
    <VendorID>00-291-647</VendorID>
    <TimeStamp>2014-08-13 12:40:11</TimeStamp>
</DataBlock>

但最终还是阅读了以下内容:

"<?xml version="1.0" encoding="utf-8"?>
<DataBlock xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Device>3867242</Device>
    <Manufacturer>COMPANY LTD</Manufacturer>
    <Data>15</Data>
    <VendorID>00-291-647</VendorID>
    <TimeStamp>2014-08-13 12:40:11</TimeStamp>
</DataBlock>ýýýý««««««««þ"

以下是阅读它的代码..

CFile oFile;
if(oFile.Open(filePath, CFile::modeRead) == FALSE)
  return NULL;

long iFileSiz = oFile.GetLength();
BYTE* pData = new BYTE[iFileSiz];

oFile.Read(pData, iFileSiz);
oFile.Close();

我在缓冲区末尾有一些垃圾字符,或者某些文件无法完全读取。

从Visual Studio调试器捕获输出。

3 个答案:

答案 0 :(得分:4)

我发现您的代码没有任何问题。但是,我会使用CByteArray而不是原始BYTE*。如果需要从二进制文件中读取数据,可以使用以下示例:

CFile oFile;
if(!oFile.Open(filePath, CFile::modeRead))
  return;

CByteArray fileData;
fileData.SetSize(oFile.GetLength()); 
UINT bytesRead = oFile.Read(fileData.GetData(), fileData.GetSize());
oFile.Close();

如果使用文本文件(需要NULL终止数据读取):

ULONGLONG dwLength = oFile.GetLength();

if (dwLength == 0)
    return FALSE;

int nSize = (int)dwLength + 1;
CStringA sData;

try
{
    LPSTR pBuffer = sData.GetBuffer(nSize);
    oFile.Read(pBuffer, nSize);
    pBuffer[(int)dwLength] = NULL;
    sData.ReleaseBuffer();
}
catch(CFileException* pFileException)
{
    pFileException->Delete();
    return;
}
catch(CMemoryException* pMemoryException)
{
    pMemoryException->Delete();
    return;
}
catch(...)
{
    return;
}

重要提示:此方法适用于小文件。请注意,最好通过块读取和处理大块文件以防止内存分配问题。

答案 1 :(得分:0)

帖子已经过时但我想添加一个答案,以便将来对其他用户有所帮助。

CFile oFile;
if(oFile.Open(filePath, CFile::modeRead) == FALSE)
  return NULL;

long iFileSiz = oFile.GetLength();  // Getting is the content length
BYTE* pData = new BYTE[iFileSiz];

oFile.Read(pData, iFileSiz);       //  Reading file content

pData[iFileSiz] = '\0';            //  Add last character as NULL

oFile.Close();

现在它将显示文件中的确切输出。

答案 2 :(得分:0)

常见错误,因为必须将数组声明为比终止NULL有空间所需的长度长1个字节:

BYTE * pData =新BYTE [iFileSiz +1 ];

pData [iFileSiz] = 0;