如何使用ReadFile修复乱码?

时间:2018-06-19 12:36:47

标签: c++ winapi win32gui

我有一个正在制作的Win32应用程序。 使用“ ReadFile”检索以Unicode编写的文本文件。 要在EditBox中打印。

$VAR1 = {
          'Editor' => [
                        'John',
                        'Mary',
                        'Jane',
                        'Peter'
                      ]
        };

但是,输出的后面有一些奇怪的字符。

const TCHAR FILE_DIRECTORY[] = TEXT("data/");
const TCHAR FILE_LIST[][MAX_LOADSTRING] = { 
    TEXT("fputs_fgets.h"), TEXT("fprintf_fscanf.h"), 
    TEXT("fprintfs_fscanfs.h"), TEXT("fread_fwrite.h"), TEXT("freads_fwrite.h") };
const int FILE_NAME_LENGTH = _tcslen(FILE_LIST[idx]);
const int FILE_DIRECTORY_LENGTH = _tcslen(FILE_DIRECTORY);

TCHAR* filePath = (TCHAR*)calloc(FILE_NAME_LENGTH + FILE_DIRECTORY_LENGTH + 1, sizeof(TCHAR));
_tcscpy_s(filePath, FILE_DIRECTORY_LENGTH + 1, FILE_DIRECTORY);
_tcscat_s(filePath, FILE_NAME_LENGTH + FILE_DIRECTORY_LENGTH + 1, FILE_LIST[idx]);

HANDLE file = CreateFile(filePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD fileSize = GetFileSize(file, NULL);
DWORD dwRead;

if (editText != NULL)
    free(editText);
editText = (TCHAR*)calloc(1, fileSize + 1);
ReadFile(file, editText, fileSize, &dwRead, NULL);
CloseHandle(file);
free(filePath);

我该如何解决? 谢谢。

1 个答案:

答案 0 :(得分:2)

假设您的文件为UTF-16,并且您正在使用定义的_UNICODE进行编译(假设您已经正确读取了其余文本,这是合理的),

editText = (TCHAR*)calloc(1, fileSize + 1);

如果您想利用fileSize + sizeof(TCHAR)所做的归零来获取NUL终止的字符串,则实际上应该执行calloc。到现在为止,您有一个宽字符串,其最后一个字符的低字节仅为零,因此其余代码继续读取垃圾,直到碰巧找到两个零的纯字节(充分对齐)为止。

请介意,我通常对此代码非常怀疑-如果您使用TCHAR,则意味着您希望同时以ANSI(TCHAR == char)和Unicode(TCHAR ==wchar_t进行编译),对此更改的解释方式将是一个有争议的想法。