Проверяя на успех fwrite в C, perror

С fwrite возврат числа успешных элементов, записанных в файл, путем высказывания:

if (!(fwrite(...))) {
    fprintf(stderr, "Failure");
    //perror(???)  I sometimes see code that says perror here and I don't know 
    //exactly what this does.
}

Это проверяет на успешную запись в файл? Там другие вещи состоят в том, чтобы волноваться о?

Спасибо.

10
задан Crystal 24 February 2010 в 21:49
поделиться

4 ответа

Короче говоря, не совсем. fwrite возвращает количество успешно записанных элементов; вам нужно сверить его с количеством элементов, которые вы собирались записать, т.е. с теми, которые вы передали в аргументе fwrite.

То, что вы сделали, проверяет, что некоторые элементы были записаны.

Вот ссылка для perror.

Интерпретирует значение глобальной переменной errno в строку и печатает эту строку в stderr (стандартный поток вывода ошибок, обычно на экран), опционально предваряя ее пользовательское сообщение, указанное в str. errno - это интегральная переменная, чье значение которой описывает последнюю ошибку возникшую при вызове библиотечной функции. Строки ошибок, выдаваемые perror, зависят от разрабатываемой платформы и компилятора. Если параметр str не является нулевым указателем, строка выводится с двоеточием (:) и пробел. Затем, независимо от того, был ли str нулевым указателем или нет, выводится описание ошибки, за которым следует символом новой строки ('\n'). perror должен быть вызван сразу после того, как ошибка иначе она может быть иначе она может быть перезаписана при вызове других функции.

12
ответ дан 3 December 2019 в 21:59
поделиться

Давайте сначала попробуем решить эту проблему в 2-D:

скажем, что у вас есть прямоугольники с X's и Y's, и вопрос аналогичен (самая высокая башня, но на этот раз вы должны беспокоиться только об одном базовом измерении).
Итак, сначала вы идете по всей коллекции, дублируя каждый прямоугольник, поворачивая его на 90 градусов (заменяя X и Y), за исключением квадратов (где X (1) = X (2) и & Y (1) = Y (2)). это представляет все возможные вариации.
затем вы сортируете их по стороне X, от самой большой до самой маленькой. в случае дублирования значения X следует удалить значение с нижним значением Y.

тот же самый принцип, примененный в сценарии 3-D, только теперь вы НЕ просто умножаете размер коллекции на 6 (все возможные варианты W, H, D), а скорее на 2. Вы делаете это, отклоняя все вариации, где ширина ниже глубины (так для каждого i, W (i) > = D (i)), а затем отклоняя вариацию, где высота не является ни самой высокой, ни самой низкой из трех измерений (потому что две другие вариации могут идти одна поверх другой, и эта не может соединиться). опять же, вы также отклоняете дубликаты (где W (1) = W (2) & & H (1) = H (2) & & D (1) = D (2)).
Тогда вы должны сортировать по ширине, только на этот раз вы не; t выбрасывать вариации с той же шириной (потому что один может поместиться в башне, что другой может не быть), то вы можете использовать алгоритм ЛИС, как описано выше @ IVlad:

D[1] = h(1);
D[i] = h(i) + max(D[j] | j <= i and we can put tower i on tower j) or simply h(i) if no such D[j] exists.

трюк был, вы знаете, что ширина является самой длинной из двух, так что вы знаете, что первый элемент не поместится поверх любого более позднего элемента.

-121--1338501-

No.

Для получения дополнительной информации см. Список функций NSIS ...

Портативный компилятор

Компилятор NSIS может быть скомпилирован для таких платформ POSIX, как Linux и * BSD. Созданный установщик будет работать только в Windows, но таким образом, они могут быть сгенерированы без Windows или WINE.

-121--2684960-

На главной странице Linux команды fwrite

fread () и fwrite () возвращает количество успешно прочитанных предметов или пишется (т.е. не количество символов). При возникновении ошибки или достигнут конец файла, возвращаемое значение - короткое число предметов (или ноль).

, поэтому необходимо сравнить с ожидаемым возвращаемым значением.

Во многих случаях может потребоваться проверка errno , равного EAGAIN или EINTR , в этом случае обычно требуется повторить запрос на запись, в то время как в других случаях требуется корректная обработка коротких записей.

Для fwrite на короткой записи (где было записано меньше, чем все ваши данные) можно проверить feof () и/или ferror (), чтобы увидеть, возвращается ли поток, и конец файла, EOF, например, если PIPE был закрыт, или если для потока установлен флаг индуктора ошибки.

0
ответ дан 3 December 2019 в 21:59
поделиться

Ваш код может некорректно проверять наличие ошибок. Используйте

if (fwrite(ptr, size, num, f) != num) {
    // An error occurred, handle it somehow
}
2
ответ дан 3 December 2019 в 21:59
поделиться
STRERROR(3)            FreeBSD Library Functions Manual            STRERROR(3)

NAME
     perror, strerror, strerror_r, sys_errlist, sys_nerr — system error mes‐
     sages

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <stdio.h>

     void
     perror(const char *string);

     ...

DESCRIPTION
     ...

     The perror() function finds the error message corresponding to the cur‐
     rent value of the global variable errno (intro(2)) and writes it, fol‐
     lowed by a newline, to the standard error file descriptor.  If the argu‐
     ment string is non‐NULL and does not point to the null character, this
     string is prepended to the message string and separated from it by a
     colon and space (“: ”); otherwise, only the error message string is
     printed.

...

STANDARDS
     The perror() and strerror() functions conform to ISO/IEC 9899:1999
     (“ISO C99”).  ...
0
ответ дан 3 December 2019 в 21:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: