如何使用 ReadFile 修复乱码?

How to fix garbled text with using ReadFile?

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

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

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

        printf("y좌표(정수): %d\n", point.y);
    }

    fclose(file);
}ﴀ﷽ý

我该如何解决? 谢谢。

假设您的文件是 UTF-16 并且您正在编译时定义了 _UNICODE(假设您的文本的其余部分被正确读取这一事实证明了这一点),在这一行中:

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

如果你想利用 calloc 所做的归零来获得以 NUL 结尾的字符串,你实际上应该做 fileSize + sizeof(TCHAR)。就像现在一样,你有一个宽字符串,它的最后一个字符只有低字节为零,所以你的代码的其余部分继续读取垃圾,直到它碰巧找到两个完整的零字节(充分对齐)。

请注意,一般来说,我对这段代码非常怀疑 - 如果您使用 TCHAR,则意味着您要同时使用 ANSI (TCHAR == char) 和 Unicode (TCHAR ==wchar_t), 改变你解释外部文件字节的方式是一个有争议的想法。