CFile读取数据到缓冲区
CFile read data to buffer
我正在尝试从文件中获取所有字节以在 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;
}
重要提示: 这种方法对于小文件来说已经足够好了。请注意,最好逐块读取和处理大文件,以防止内存分配问题。
Post 是旧的,但我想添加一个答案,以便将来对其他用户有所帮助。
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] = '[=10=]'; // Add last character as NULL
oFile.Close();
现在它将显示与文件中一样的准确输出。
常见错误,因为您必须声明数组比终止 NULL 所需的 space 长 1 个字节:
BYTE* pData = new BYTE[iFileSiz + 1];
pData[iFileSiz] = 0;
我正在尝试从文件中获取所有字节以在 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;
}
重要提示: 这种方法对于小文件来说已经足够好了。请注意,最好逐块读取和处理大文件,以防止内存分配问题。
Post 是旧的,但我想添加一个答案,以便将来对其他用户有所帮助。
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] = '[=10=]'; // Add last character as NULL
oFile.Close();
现在它将显示与文件中一样的准确输出。
常见错误,因为您必须声明数组比终止 NULL 所需的 space 长 1 个字节:
BYTE* pData = new BYTE[iFileSiz + 1];
pData[iFileSiz] = 0;