2017-01-15 10 views
1

Новое программирование на C.Почему это использование fscanf приводит к сбою приложения?

Следующий раздел кода пытается прочитать список MD5 (32 символа) и соответствующее описание (до 128 символов) из текстового файла (utf-8), но вызывает сбой приложения:

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. Является ли мое использование таНос (...) правильно?
  2. Что может быть причиной аварии?

Update 1

Я взял этот код и сделал его в автономный EXE файл (а не DLL). Все еще падает.

Update 2

Обновлен fwscanf согласно комментарий Криса. Все еще падает. Если я прокомментирую строку while...fwscanf..., она выйдет правильно.

+0

С какой ошибкой происходит сбой? Это важно. – Carcigenicate

+0

Код для DLL, который является плагином. Отчеты хостинг-приложения «Исключение типа 216 произошло при смещении 180002F (относительное смещение ошибки 2FBC)» – Bridgey

+0

Является ли это файлом Unicode? Я спрашиваю, потому что замечаю, что вы используете '% ls' и' wchar_t'. В этой статье [Microsoft] (https://msdn.microsoft.com/en-us/library/cb5kac8b.aspx) указано, что «' fscanf' в настоящее время не поддерживает ввод потока UNICODE »и рекомендует вместо этого использовать' fwscanf' , – chrisaycock

ответ

3

CreateFileW() возвращает дескриптор Windows, который вроде как номер файла, но по-разному. fwscanf() ожидает, что FILE* не является дескриптором Windows; чтобы получить FILE*, откройте файл fopen() или _wfopen().

+0

Это замечательно! Чтобы соответствовать остальной части проекта, я должен найти эквивалент Microsoft для 'fwscanf', когда файл открывается с помощью CreateFileW(). – Bridgey

0
  1. % s хранит нулевой ограничитель. Malloc 33 и 129 символов.
+0

Спасибо, хорошее место. Хотя мне нужно исправить это, похоже, это не вызывает крушения. – Bridgey

0

% s хранит строку с нулевым завершением под адресом, который вы предоставляете. Чтобы сохранить n значимых символов без переполнения буфера, вам необходимо указать адрес n + 1 длинного буфера.

+0

Спасибо, хорошее место. Хотя мне нужно исправить это, похоже, это не вызывает крушения. – Bridgey