C fopen échoue pour écrire avec errno est de 2
Je ne comprends pas pourquoi c'est apparemment échoue avec errno 2:
char debugText [256];
sprintf (debugText, "C:\\List.txt");
dfile = fopen( debugText, "w");
fprintf ( dfile, " err %d \n", errno);
Je dis apparemment parce que tout dfile est NULL, le fichier est créé et est rempli avec de ma sortie.
donc ce qui se passe ?
Ce type est
jetez un oeil à
(Pour les googlers)Pour moi, c'était que le dossier avait pas les autorisations d'écriture. Sur Windows: clic Droit > Propriétés > > Modifier. Ensuite, permettre de le modifier pour tous les utilisateurs
dfile
? Où est le test pour NULL
?jetez un oeil à
strerror()
qui retourne une chaîne de caractères qui explique errno
pour vous.(Pour les googlers)Pour moi, c'était que le dossier avait pas les autorisations d'écriture. Sur Windows: clic Droit > Propriétés > > Modifier. Ensuite, permettre de le modifier pour tous les utilisateurs
OriginalL'auteur JPM | 2013-04-01
Vous devez vous connecter pour publier un commentaire.
Tout ce que vous avez dit est que
errno
a la valeur 2 après votrefopen
appel. Vous ne savez pas que l'appel a échoué, parce que vous n'avez pas vérifier si lesdfile == NULL
. Si la sortie a été écrit dans le fichier, sans doute lefopen
appel a réussi et leerrno
valeur a été laissé plus d'un certain appel, probablement l'une que vous n'avez pas explicitement.À défaut, les appels peuvent définir
errno
à une valeur non-nulle valeur, mais le succès des appels ne pas ensembleerrno
à 0. Pour vérifier les erreurs, vous devezerrno
à 0 avant l'appel;errno
après l'appel -- mais seulement si vous savez qu'il a échoué (sinon, la valeur deerrno
est vide de sens).Si
defile == NULL
, puis lefprintf
appel a un comportement indéfini; il ne sera probablement pas.D'autre part, vous dites que
dfile
estNULL
. Comment le savez-vous? Votre code n'est pas le vérifier. (Si lefopen
appel a vraiment fait échouer, pourrait le contenu deC:\List.txt
être de gauche au cours d'une exécution précédente de votre programme?)Ce que la sortie ne vous obtenez à partir de ce programme?
Vous devez vérifier si
defile == NULL
dans votre programme, et puis ne pas essayer d'écrire dans le fichier si il est. Pour vérifier pourquoifopen()
ne marche pas, comme je l'ai suggéré avecerrno
. En supposant que vous êtes sur un système Windows, ouverture"C:\\List.txt"
pour la sortie ne devrait pas échouer avecerrno==2
, qui signifie "No such file or directory". (Vous sur Windows, non? Et pas sous Cygwin?)Essayez le programme que je viens d'ajouter à ma réponse.
OriginalL'auteur Keith Thompson
Voici une liste des codes d'erreur:
http://www.thegeekstuff.com/2010/10/linux-error-codes/
Mais vous devriez vérifier si
fopen()
retournéNULL
d'abord parce que cette valeur danserrno
peut-être laissé quelque chose d'autre.OriginalL'auteur Johnny Mnemonic
Pas de fonction de bibliothèque de jamais jeux de
errno
à zéro.Vous ne devriez vérifier
errno
après une fonction signale une erreur.Par exemple, votre code doit être:
Si la fonction n'est pas une défaillance de l'état, la valeur de
errno
peut-être rien. Par exemple, sur un système Solaris, vous finissent souvent avecerrno
ensemble deENOTTY
après une opération réussie, parce questdout
n'est pas connecté à un terminal. Cela ne signifie pas que quelque chose s'est mal passé; cela signifie simplement qu'un test pour savoir si la sortie standard est un terminal d'échec (car il n'est pas un terminal).Vous n'avez pas à prouver que
dfile == NULL
; en effet, depuis les suivantesfprintf()
l'utilise, il est improbable quedfile
est null (vous auriez probablement obtenir un crash dansfprintf()
si elle était nulle). Vous devriez réviser votre code explicitement testdfile
avant je serais disposé à croire que votre affirmation quedfile
est nul (et de rendre compte de l'erreur sur un canal autre quedfile
).OriginalL'auteur Jonathan Leffler