6
votes

Pourquoi Fopen n'échoue-t-il pas à ouvrir un fichier existant?

Je suis sur Windows XP à l'aide de Visual Studio 6 (oui je sais qu'il est vieux) Bâtiment / entretien d'une DLL C ++. Je suis rencontré un problème avec Fopen omis d'ouvrir un fichier existant, il renvoie toujours Null.

J'ai essayé:

  • Vérification errno et _doserrno en définissant à zéro puis à les vérifier à nouveau, les deux restent zéro et donc getlasterRor () signale aucune erreur. Je sais que fopen n'est pas obligé de définir Erno lorsqu'il rencontre une erreur selon une norme C.
  • Le code de fichier du fichier, qui ne sont pas relatifs.
  • essayé sur une autre machine de développeurs qui le même résultat.

    La chose vraiment étrange est Createfile Works et le fichier peut être lu avec ReadFile. Nous pensons que cela fonctionne dans une version de libération, mais nous constatons également un comportement très étrange dans d'autres domaines de l'application et nous ne sommes pas sûrs que cela soit associé.

    Le code est ci-dessous, je ne fais pas T voir quelque chose d'étrange, il a l'air assez standard pour moi. Le fichier source n'a pas changé pour un peu moins d'une demi-an. xxx


8 commentaires

Visual C ++ 6 n'est pas vraiment C ++. Certes, le marquage C et C ++ est absurde. Décidez d'une langue, à la fois dans vos balises et dans votre code.


Oh, et quant à la question, vérifiez que vous avez la permission d'accéder au fichier. Il ne faut pas simplement exister: votre programme doit être capable d'y accéder.


@Tomalak: Ouais, nous l'obtenons, VC ++ 6.0 n'est pas conforme aux normes. Mais il est déroutant de dire aux gens que ce n'est pas C ++ quand il prétend très clairement être. Ce n'est certainement pas c, alors quelle est l'alternative? Je suis tout à fait d'accord que le marquage C et C ++ est absurde.


@Codygray: Ce n'est pas C ++. Il est non conforme (comme vous le dites) de trop nombreux moyens d'être désignés avec précision ou responsable de C ++. C'est une langue C ++. J'apprécie que cela pourrait sembler dramatique, mais est une grande distinction lorsque vous aidez quelqu'un sur le code qui a été annoncé comme C ++ mais n'est vraiment pas soumis aux mêmes lois.


Fopen n'a pas la sémantique d'attribut de sécurité que les fenêtres exigent.


Ce point laborieux à propos de la conformité C ++ de VC6 est totalement sans pertinents pour une question qui est en réalité sur une question à la bibliothèque standard C, bien qu'à partir de C ++ (ou quoi que Tomalak pense que nous devrions appeler la langue que le compilateur VC6 C ++ compilait)


Si, pour une raison quelconque, vous devez pouvoir ouvrir plus de 512 fichiers, vous pouvez augmenter cela à l'aide de la fonction _setMAXSTDIO . Voir le Documentation . (En outre, vous devriez publier "la réponse" comme réponse réelle, plutôt que dans le cadre de votre question, puis acceptez-la en cliquant sur la coche dans la marge gauche.)


L'application n'a pas besoin de nombreux fichiers ouverts. C'était simplement une incompatibilité fopen et fclose.


5 Réponses :


2
votes

Votre fonction a un type de retour hresult (où 0 est bon) mais vous retournez un booléen (où 0 est mauvais). Cela ne peut pas avoir raison ...


1 commentaires

Mon erreur aurait dû être s_false.



1
votes

En supposant que vous avez une version raisonnable de VC6, vous disposez du code source au CRT et vous pouvez entrer dans l'appel Fopen, puis à l'appel de CreateFile que le CRT fera. (Préparez-vous que cela soit très long!)


1 commentaires

J'ai trouvé les sources CRT du disque d'installation et je suis entré dans Fopen. Heureusement, je n'ai pas eu à marcher trop loin pour découvrir la cause. (Voir la question originale)



0
votes

Mettez le point d'arrêt sur la ligne Fopen, déclenchez-le dans le débogueur, entrez " ERR, HR "dans la fenêtre" Watch ", exécutez la ligne et enregistrez la montre quel était le problème. Très probablement ses autorisations d'accès.


0 commentaires

10
votes

la réponse:

J'ai trouvé la cause, trop de manipulations de fichier ouvertes causées par certaines mises à jour récentes de l'application. Ceux-ci où ne changent pas de code, ce bogue a donc été présent depuis un moment. Je suis entré dans la fonction fopen jusqu'à une fonction appelée _Getstream. Cela tente de trouver un flux non utilisé, la fonction recherche une table de 512 flux suffisamment toutes les 512 où utilisent et d'autres appels à Fopen où l'échec de l'échec. J'ai utilisé le Poignée Outil de Sysinternals pour voir le nombre de poignées usées.


1 commentaires

S'il vous plaît vérifier ma réponse



0
votes

Vous avez déjà 512 fichiers ouverts.

Nous ne pouvons contenir que des fichiers ouverts maximum 512 dans l'application VC. Je suggère de fermer les fichiers inutiles en utilisant fcfose .


0 commentaires