Avec FLERITE Renvoie le nombre d'éléments réussis écrits dans le fichier, en disant:
if (!(fwrite(...))) { fprintf(stderr, "Failure"); //perror(???) I sometimes see code that says perror here and I don't know //exactly what this does. }
5 Réponses :
En bref, pas tout à fait. Qu'est-ce que vous avez fait des vérifications que certains éléments ont été écrits. P>
Voici une référence pour Perror . P>
interprète la valeur du global
errono variable dans une chaîne et
imprime cette chaîne à starr (standard
Stream de sortie d'erreur, généralement le
écran), facultatif qui le précède avec
le message personnalisé spécifié dans Str.
errno est une variable intégrale dont
la valeur décrit la dernière erreur
Produit par un appel à une bibliothèque
une fonction. Les chaînes d'erreur produites
par Perror dépend du développement
plate-forme et compilateur. Si la
Le paramètre STR n'est pas un pointeur nul,
STR est imprimé suivi d'un colon (:)
et un espace. Alors, si Str était un
pointeur nul ou pas, le généré
La description d'erreur est imprimée suivie
par un personnage nouveau ('\ n'). perror
devrait être appelé juste après l'erreur
a été produit, sinon cela peut être
écrasé dans les appels vers d'autres
Fonctions. P>
blockQuote> fwrite code> renvoie le nombre d'éléments écrits avec succès; Vous devez vérifier cela contre le nombre d'éléments que vous aviez destiné à écrire, c'est-à-dire. Ceux que vous avez transmis en argument à la f. p>
Il n'est pas nécessaire de comparer fwrite code> contre le nombre d'éléments si vous arrangez pour toujours l'appeler avec
1 code> élément de taille
len code>. Ensuite, les valeurs de retour possibles ne sont que de 0 et 1, avec 0 indiquant toute défaillance et 1 indiquant le succès.
Votre code pourrait ne pas vérifier correctement les erreurs. Utilisez
if (fwrite(ptr, size, num, f) != num) { // An error occurred, handle it somehow }
@mctylr: faux. fwrite code> ne peut pas gérer
eagain code> ou
eintr code> du tout. Ils définiront l'indicateur d'erreur du flux, et il n'ya aucun moyen de reprendre l'écriture sans que les données perdus ou en double (due à la ne pas connaître l'état du tampon). Si vous souhaitez utiliser des signaux d'interruption ou souhaitez configurer un fichier en tant que non bloque, Stdio n'est généralement pas utilisable.
de la page homme Linux de fwrite p>
Fread () et fwrite () renvoient le nombre d'articles lus avec succès ou écrit (c'est-à-dire pas le nombre de caractères). Si une erreur se produit, ou Le bout de fichier est atteint, la valeur de retour est un nombre d'éléments court (ou zéro). p> blockQuote>
Vous devez donc comparer avec quelle est la valeur de retour attendue. p>
Dans de nombreux cas, vous devrez peut-être recherchererrno code> égal à
eagain code> ou
eintr code>, auquel cas tu veux normalement Réessayez la demande d'écriture, tandis que dans d'autres cas, vous souhaitez gérer des écrires courts gracieusement. grève> p>
pour fwrite, sur un écrit court em> (où moins de vos données complètes a été écrit) Vous pouvez vérifier Feof () et / ou FERROR () pour voir si le flux retourne et fin. -File, EOF, comme si un tuyau était fermé ou si le flux a son drapeau de l'inducteur d'erreur. P>
Voir mon commentaire sur votre autre commentaire. Des réessayer comme vous dites entraîneront une défaillance répétée et / ou une corruption de données.
Oui, je l'ai fait Bork, et j'ai frappé mon erreur d'origine. Un programme peut tenter d'appeler fwrite () code> après avoir appelé
eplearerr () code> en toute sécurité, vérifiant à nouveau pour une erreur continue / défaillance / EOF, dans ma compréhension.
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â). ...
Vous pouvez également utiliser Le page explique: p> La fonction La variable Global Erno sera utilisée pour obtenir la valeur d'erreur à décoder. P>
Cette fonction est destinée à être utilisée de manière similaire à celle de l'exemple suivant (la page man ici, comme indiqué correctement par @Puchu dans le commentaire ci-dessous. J'ai corrigé le code pour résoudre le problème): P>
explic_fwrite () code>,
expliquer_errno_fwrite code>, ... à partir de
libexplain code>.
wedlook_fwrite code> est utilisée pour obtenir une explication d'une erreur renvoyée par l'appel du système
fwrite (3) code> appel. Le moins que le message contiendra est la valeur de
strError (errno) code>,
if (fwrite(ptr, size, nmemb, fp) < nmemb)
{
fprintf(stderr, "%s\n", explain_fwrite(ptr, size, nmemb, fp));
exit(EXIT_FAILURE);
}
fwrite retourne taille_t code>.
taille_t code> est une valeur non signée. Il n'est pas possible de
<0 code>.
@puchu: merci. Tu as raison. La page man était tort. S'il vous plaît voir la réponse corrigée.