2010-05-17 89 views
2

我想加载到字符串保存在文件中的文件的内容。该文件是在VisualStudio中创建的.CS代码,因此我认为它是以UTF-8编码保存的。我这样做:错误的读取文件在UNICODE(fread)在C + +

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

回答

1

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

我不明白如何解码它。我所需要的是将文件的内容作为unicode字符串(实际上我想将其复制到缓冲区中)。采取lpContent的长度只是以前lpContent的一半,这是正常吗? – mimic 2010-05-17 22:02:35

+0

万岁!我做的!非常感谢!!! – mimic 2010-05-17 22:20:27

1

字符串是否包含cs文件的所有内容,然后附加有趣的字符?可能它只是不正确的空终止,因为fread不会自动做到这一点。您需要设置的字符字符串内容到零以下:

lpContent[lSize] = 0; 
+0

我试过了,但没有帮助。 – mimic 2010-05-17 22:01:19