簡體   English   中英

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而不是raw 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;
}

重要說明:這種方法對於小型文件已經足夠了。 請注意,最好逐塊讀取和處理大文件,以防止出現內存分配問題。

帖子已過時,但我想為其添加答案,以便將來對其他用戶有幫助。

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();

現在它將顯示文件中的確切輸出。

常見錯誤,因為您必須將數組聲明的長度比為終止NULL留出空間所需的長度長1個字節:

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

pData [iFileSiz] = 0;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM