c++ - C++ 上的 UNICODE (fread) 读取文件错误

标签 c++ unicode malloc fread

我正在尝试将保存在 dics 上的文件内容加载到字符串中。该文件是 .CS 代码,是在 VisualStudio 中创建的,所以我想它是以 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); 

关于c++ - C++ 上的 UNICODE (fread) 读取文件错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2852772/

相关文章:

windows - 重新运行时将 Unicode 参数传递给 Windows .bat 文件

c - 动态内存访问仅在函数内部有效

c - Malloc 段错误

c++ - 在头文件中定义 C++ 函数是一种好习惯吗?

c++ - N-Rooks 解决方案回溯数量

c++ - 读取文件并将其添加到文本框 : string conversion issue

Python unicode 解码错误 SUD

java - 通过按位运算将 Unicode 转换为字符

c - 如何分配内存、赋值并将其返回给调用函数?

c++ - 将包含十六进制值的字符串转换为c中的字符字节