在C ++上使用UNICODE(fread)读错误文件

时间:2010-05-17 20:59:27

标签: 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文件的内容),然后出现像췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍strange strange strange等奇怪的符号。 所以我认为我以错误的方式阅读了内容。但如何正确地做到这一点? 非常感谢你,我希望听到!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

字符串是否包含cs文件的所有内容,然后其他有趣的字符?可能它只是没有正确地以空值终止,因为fread不会自动执行此操作。您需要将字符串内容后面的字符设置为零:

lpContent[lSize] = 0;

答案 2 :(得分: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));