我有一个正在制作的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);
我该如何解决? 谢谢。
答案 0 :(得分:2)
假设您的文件为UTF-16,并且您正在使用定义的_UNICODE
进行编译(假设您已经正确读取了其余文本,这是合理的),
editText = (TCHAR*)calloc(1, fileSize + 1);
如果您想利用fileSize + sizeof(TCHAR)
所做的归零来获取NUL终止的字符串,则实际上应该执行calloc
。到现在为止,您有一个宽字符串,其最后一个字符的低字节仅为零,因此其余代码继续读取垃圾,直到碰巧找到两个零的纯字节(充分对齐)为止。
请介意,我通常对此代码非常怀疑-如果您使用TCHAR
,则意味着您希望同时以ANSI(TCHAR == char
)和Unicode(TCHAR ==wchar_t
进行编译),对此更改的解释方式将是一个有争议的想法。