如何使用 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
), 改变你解释外部文件字节的方式是一个有争议的想法。
我正在制作一个 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
), 改变你解释外部文件字节的方式是一个有争议的想法。