Неправильное чтение файла в UNICODE (fread) на C ++ - PullRequest
3 голосов
/ 18 мая 2010

Я пытаюсь загрузить в строку содержимое файла, сохраненного в DIC. Файл представляет собой код .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), затем появляются странные символы, такие как 췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍. Поэтому я думаю, что я прочитал содержание неправильно. Но как сделать это правильно? Большое вам спасибо, и я хочу услышать!

Ответы [ 2 ]

2 голосов
/ 18 мая 2010

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 голос
/ 18 мая 2010

Содержит ли строка все содержимое файла cs, а затем дополнительные забавные символы? Вероятно, это просто неправильно завершается нулем, поскольку fread не будет делать это автоматически. Вам нужно установить символ после содержимого строки на ноль:

lpContent[lSize] = 0;
...