新的C编程。
以下部分代码尝试从文本文件(utf-8)中读取一个制表符分隔的MD5(32个字符)和相应的描述(最多128个字符)的列表,但导致应用程序崩溃:
HANDLE hFile = CreateFileW(good_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if (hFile == INVALID_HANDLE_VALUE) { return FALSE; } LPWSTR md5 = malloc(sizeof(wchar_t) * 32); LPWSTR desc = malloc(sizeof(wchar_t) * 128); int i; while((i = fwscanf(hFile, L"%ls %ls", md5, desc)) != EOF) { if (i == 2) // OK { } else // Something went wrong { } } CloseHandle(hFile); return TRUE;
几个问题:
更新1
我已经把这个代码,并成为一个独立的exe(而不是一个DLL)。 仍然崩溃。
更新2
根据Chris的评论更新为fwscanf。 仍然崩溃。 如果我注释掉while...fwscanf...
行,它会正常退出。
CreateFileW()
返回一个Windows句柄,这有点像一个文件编号,但是不同。 fwscanf()
需要FILE*
不是Windows句柄; 得到一个FILE*
用fopen()
或_wfopen()
打开你的文件。
%s在您提供的地址下存储一个nul结尾的字符串。 要存储n个没有缓冲区溢出的重要字符,需要提供n + 1个长缓冲区的地址。