fclose valeur de retour case
Est-il nécessaire de vérifier la valeur de retour de la fonction fclose? Si nous avons réussi à ouvrir un fichier, quelles sont les chances qu'il peut ne parviennent pas à fermer?
Merci!
Ce qui concerne,
Jay
- Merci à tous pour toutes ces réponses! 🙂
- voir aussi: stackoverflow.com/questions/569573/...
- Vous devriez envisager de marquer l'un comme correcte.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous
fwrite
à un fichier, cela risque de ne pas écrire quoi que ce soit, il peut rester dans une mémoire tampon (à l'intérieur de l'objet FICHIER). L'appel defflush
serait en fait de l'écrire sur le disque. Que l'opération peut échouer, par exemple, si vous juste couru hors de l'espace disque, ou il y a une autre erreur d'e/S.fclose
vide les tampons implicitement trop, de sorte qu'il peut échouer pour les mêmes raisons.De comp.lang.c:
Vous pourrait (et devrait) le rapport de l'erreur, mais dans un sens, le flux de données est toujours fermé:
fclose()
va vider les non écrites de sortie (viafflush()
) avant de revenir, de sorte que l'erreur des résultats de la sous-jacenteswrite()
ne sera pas reporté àfwrite()
oufprintf()
temps, mais quand vous faites lefclose()
. En conséquence, toute erreur quiwrite()
oufflush()
peut générer peuvent être générés parfclose()
.fclose()
également appelclose()
qui peut générer des erreurs sur les clients NFS, où le changement de fichier n'est pas téléchargé vers le serveur distant jusqu'à ce queclose()
temps. Si le serveur NFS s'est écrasé, puis lesclose()
sera un échec, et doncfclose()
échoue également. Cela peut être vrai pour d'autres systèmes de fichiers en réseau.Vous devez TOUJOURS vérifier le résultat de la fonction fclose()
Disons que vous êtes la production de données. Vous avez de vieilles données que vous
fread()
à partir d'un fichier, et ensuite effectuer un traitement sur les données, générer plus de données, et puis les écrire dans un nouveau fichier. Vous êtes prudent de ne pas écraser l'ancien fichier, car vous savez que d'essayer de créer un nouveau fichier peut échouer, et vous souhaitez conserver vos anciennes données dans ce cas (certaines données, c'est mieux que pas de données). Après avoir terminé tous lesfwrite()
s, qui tout réussi (parce que vous méticuleusement vérifié la valeur de retour defwrite()
), vousfclose()
le fichier. Ensuite, vousrename()
votre juste écrit fichier et d'écraser l'ancien fichier.Si
fclose()
échoué en raison d'une erreur d'écriture (disque plein?), vous avez juste a remplacé votre dernière bonne fichier avec quelque chose qui pourrait être indésirable. Oups.Donc, si il est essentiel, vous devez vérifier la valeur de retour de
fclose()
.En termes de code:
Dans le code ci-dessus, nous avons été prudents
fopen()
,fwrite()
, etfread()
, mais même alors, pas de vérification defclose()
peut entraîner la perte de données (lors de la compilation avecMAYLOSE_DATA
défini).Une raison fclose peut échouer si il n'y a aucune données encore tampon et l'implicite fflush échoue. Ce que je recommande est de toujours faire appel à fflush et faire toute erreur de manipulation il.
J'ai vu de nombreuses fois à la fonction fclose() de retour non nulle.
Et un examen attentif de constater que le problème avec l'écriture et de ne pas fclose.
Depuis les trucs écrits sont mis en mémoire tampon avant réelle écriture qui se passe et quand une fonction fclose() est appelé tout le tampon est vidé. De sorte que tout problème dans l'écriture de la mémoire tampon suff, disent que le disque est plein, apparaît au cours de la fonction fclose(). Comme David Crier dit, à écrire une balle de preuve de l'application, vous devez tenir compte de la valeur de retour de la fonction fclose().
La fclose page de man de la cites qu'il peut échouer pour l'une des raisons de fermer ou de fflush peut échouer.
De citer:
fflush peut échouer pour des raisons que écrire() serait un échec, essentiellement dans le cas où vous ne pouvez pas écrire/enregistrer le fichier.
Si, dans le contexte de votre demande, vous pouvez penser à quelque chose d'utile à faire si la fonction fclose() échoue, puis de tester la valeur de retour. Si vous ne pouvez pas, ne pas.
Dans un sens, fermeture d'un fichier n'échoue jamais: les erreurs sont retournées si l'attente d'une opération d'écriture a échoué, mais le flux sera être fermé.
Pour éviter les problèmes et de s'assurer (autant que vous le pouvez à partir d'un programme C), je vous propose:
fwrite()
.fflush()
avant de fermer le flux de données. Ne n'oubliez pas de vérifier pour les erreurs retournées parfflush()
.