我正在尝试加载字符串保存在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等奇怪的符号。 所以我认为我以错误的方式阅读了内容。但如何正确地做到这一点? 非常感谢你,我希望听到!
答案 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));