c++ - CFile读取数据到缓冲区

标签 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 调试器捕获的。

最佳答案

我没有发现您的代码有任何问题。但是,我会使用 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;
}

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

关于c++ - CFile读取数据到缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29347828/

相关文章:

c++ - 在静态文本控件上设置图标

c++ - 创建对话框时更改对话框的标题

c++ - 在 MFC 程序中创建 Hook 窗口

.net - 无法找到入口点 (cpp)

c++ - 相同版本的 clang 在不同操作系统上给出不同的结果

c++ - 范围问题 : which variable would a inline function access in the following code ?

c++ - 没有 iomanip 的 setprecision

c++ - 在其他计算机 C++ 中运行包含 MFC 类的 Dll

wpf - 如果我的背景是 C++/MFC,那么进入 VS2010、C# 4 和 WPF 的最佳方法是什么

c# - 包装 C++ 以便在 C# 中使用