ferror (файл) == 32 - PullRequest
       43

ferror (файл) == 32

0 голосов
/ 24 января 2009

Иногда, когда я открываю файл примерно так:

FILE *file = fopen(fname, "wb");
if(!file) printf("Error code: %d\n",ferror(file));

Я получаю результат 32. Что это значит? В частности, для eMbedded Visual C ++ 4.0

Кроме того, похоже, что eVC не поддерживает perror / errno: (

Ответы [ 3 ]

6 голосов
/ 24 января 2009

Вы используете ferror () неправильно: он работает только с допустимым (ненулевым) дескриптором файла. Передача его NULL (в случае сбоя fopen ()) вызывает UB, что проявляется в вашем случае при печати случайного значения (отсутствие захвата при обращении к указателю NULL указывает на то, что базовая платформа не имеет защиты памяти).

2 голосов
/ 24 января 2009

вы должны попытаться проверить, что perror говорит об ошибке. Используйте как это:

perror("fopen");

будет выводиться сообщение, подобное этому:

fopen: <error description here>

Я полагаю, поскольку вы используете ferror, когда ваш файловый объект имеет значение NULL, эта ошибка 32 - просто случайный мусор, как упоминалось в другой публикации, вероятно, отсутствие захвата указателя NULL. используйте errno / perror, чтобы получить ошибку, которая помешала вам открыть файл. на самом деле, указатель NULL на ferror запрещен.

РЕДАКТИРОВАТЬ: Я нахожу удивительным, что как perror, так и errno не поддерживаются этим компилятором. Я рекомендую вам найти правильные функции обнаружения ошибок и использовать их. в этом случае, конечно, не правда.

РЕДАКТИРОВАТЬ: посмотрите GetLastError () и FormatMessage () , они должны поддерживаться. http://msdn.microsoft.com/en-us/library/ms680582(VS.85).aspx также имеет пример использования там. Хотя вам, вероятно, придется заменить функции «безопасной строки» в Microsoft на обычные Си. (например: StringCchPrintf -> _snprintf / sprintf)

Небольшой поиск в Google показывает, что это может сработать для вас. Это не мой код, но выглядит разумно:

// OS provides a system error string
DWORD dwError = GetLastError();
CString csDescription;
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL, dwError, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
    csDescription.GetBuffer(255), nSize, NULL );
csDescription.ReleaseBuffer();
0 голосов
/ 13 июня 2013

Из здесь может показаться, что у вас сломанная труба

...