簡體   English   中英

在 C++ 上以 UNICODE (fread) 錯誤讀取文件

[英]Wrong reading file in UNICODE (fread) on C++

我正在嘗試將保存在 dics 上的文件內容加載到字符串中。 該文件是在 VisualStudio 中創建的 .CS 代碼,所以我想它是以 UTF-8 編碼保存的。 我這樣做:

FILE *fConnect = _wfopen(connectFilePath, _T("r,ccs=UTF-8"));
    if (!fConnect)
        return;
    fseek(fConnect, 0, SEEK_END);
    lSize = ftell(fConnect);
    rewind(fConnect);

    LPTSTR lpContent = (LPTSTR)malloc(sizeof(TCHAR) * lSize + 1);
    fread(lpContent, sizeof(TCHAR), lSize, fConnect);

但是結果很奇怪 - 第一部分(字符串的一半是 .CS 文件的內容),然后出現了 췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍等奇怪的符號。 所以我認為我以錯誤的方式閱讀了內容。 但是如何正確地做到這一點? 非常感謝,我想聽聽!

ftell()、fseek() 和 fread() 都對字節進行操作,而不是對字符進行操作。 在 Unicode 環境中,TCHAR 至少為 2 個字節,因此您分配和讀取的內存是應有的兩倍。

我從未見過 fopen() 或 _wfopen() 支持“ccs”屬性。 您應該使用“rb”作為讀取模式,將原始字節讀取到內存中,然后在它們全部可用后對其進行解碼,即:

FILE *fConnect = _wfopen(connectFilePath, _T("rb")); 
if (!fConnect) 
  return; 
fseek(fConnect, 0, SEEK_END); 
lSize = ftell(fConnect); 
rewind(fConnect); 

LPBYTE lpContent = (LPBYTE) malloc(lSize); 
fread(lpContent, 1, lSize, fConnect);
fclose(lpContent);

.. decode lpContent as needed ...
free(lpContent); 

該字符串是否包含 cs 文件的所有內容以及其他有趣的字符? 可能它只是沒有正確地以空值終止,因為fread不會自動這樣做。 您需要將字符串內容后面的字符設置為零:

lpContent[lSize] = 0;

.. 根據需要解碼 lpContent ...

s2ws 函數將字符串轉換為 wstring

std::wstring s2ws(const std::string& str)
{
    int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo(size_needed, 0);
    MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}

在緩沖區末尾添加空終止符:

lpContent[lSize-1] = 0;

從緩沖區內容初始化 wstring

std::wstring replyStr = (s2ws((char*)lpContent));

暫無
暫無

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

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