11
votes

Impossible d'ouvrir un fichier avec fopen ()

J'essaie d'ouvrir un fichier de fichier et de sortie, mais je continue à obtenir des erreurs. J'ai donc pensé commencer au tout début et essayez simplement d'ouvrir le fichier. Ceci est mon code: xxx

lorsque j'exécute le fichier, "erreur" est imprimé sur la console et c'est tout. Le testfile1.txt est au même endroit que mon article .exe. Comment puis-je réparer ça?


0 commentaires

8 Réponses :


4
votes

Le répertoire de travail de votre exécutable est probablement défini sur autre chose que le répertoire où il est enregistré. Vérifiez vos paramètres d'IDE.


1 commentaires

Ouais. Par exemple, Visual Studio peut définir le répertoire actuel sur l'endroit où le fichier de solution (.sln) est ATTENDU QUE le fichier EXE peut être dans le dossier "Débogage".



13
votes

Comment exécutez-vous le fichier? Est-ce de la ligne de commande ou d'un IDE? Le répertoire que votre exécutable est dans n'est pas nécessairement votre répertoire de travail.

Essayez d'utiliser le nom complet du chemin dans le fopen code> et voyez si cela le corrige. Si tel est le cas, le problème est tel que décrit. P>

Par exemple: P>

system ("cd")
system("pwd")


4 commentaires

Aucun besoin pour les barres anti-backs, qui mènent souvent à des erreurs subtiles par des personnes qui ont des problèmes qui ont des problèmes comme fopen () travailler. Vous devriez recommander des barres obliques en avant.


Je ne recommande ni transfert ni esclaves en arrière car la norme ne manda pas le format du nom du fichier. Mais vous manquez le point si vous avez bu pour cette raison - l'intention était simplement de démontrer l'utilisation d'un chemin de fichier complet.


Pourriez-vous s'il vous plaît jeter un oeil sur les éléments suivants: fichier * Pfile = null; const Char * FileName = "E: /Code/Test/Test.txt"; Pfile = fopen (nom de fichier, "r"); et dites-moi ce qui me manque ou fais mal. J'ai aussi essayé: const char * nom_fichier = "E: \\ code \\ test \\ test.txt"; . Rien ne semble fonctionner. Le programme est exécuté mais n'imprime rien sur cmd . Il affiche l'avertissement suivant: Avertissement 1 AVERTISSEMENT C4133: 'Fonction': Types incompatibles - à partir de "Fichier *" à "Cons-Char * . IDE: vs 2013.


@barnes, posez une question Ne laissez pas de commentaire. De cette façon, vous obtiendrez beaucoup plus d'exposition. En tant que supposion éduquée, je vous suggère que vous utilisez nom de fichier quelque part où vous devriez utiliser Pfile ou vice versa.



0
votes

Le répertoire de dossier de sortie doit avoir été configuré dans un autre répertoire de l'IDE. Soit vous pouvez changer cela ou remplacer le nom de fichier avec un chemin de fichier complet.

J'espère que cela aide.


2 commentaires

Grands commentaires. Maintenant, je suis capable d'ouvrir mon fichier au moins manuellement de cette façon. Comment puis-je le faire de la ligne de commande dans Visual Studio? J'ai essayé ceci sur Xcode en ajoutant des paramètres, mais cela ne vous efforçait tout simplement pas pour moi. J'espérais que Visual Studio me donnerait plus de chance. Merci!


Xcode et Visual Studio pourraient définir différents répertoires de travail, mais le problème est le même, et c'est la solution. Vous devez inclure du code dans votre application qui change dans le répertoire souhaité.



5
votes

Un peu de vérification des erreurs va très longtemps - vous pouvez toujours tester la valeur de Erno ou appeler Perror () ou StreRror () pour obtenir plus d'informations sur la raison pour laquelle l'appel Fopen () a échoué.

Sinon, les suggestions sur la vérification du chemin sont probablement correctes ... Vous n'êtes probablement pas dans le répertoire, vous pensez que vous venez de l'EDI et que vous n'avez pas les autorisations que vous attendez.


0 commentaires

22
votes

au lieu de printf ("erreur"); , vous devez essayer perror ("erreur") qui peut imprimer la raison de l'échec (comme un problème de permission, invalide. Argument, etc.).


1 commentaires

Si vous trouvez perror pas assez flexible, vous pouvez également utiliser printf ("Erreur:% d (% s) \ n", errno, strierror (errno)) ou même Printf ("Erreur:% M \ N") (une extension GLIBC).



4
votes

Eh bien, vous savez maintenant qu'il y a un problème, la prochaine étape consiste à déterminer quelle est exactement l'erreur, que se passe-t-il lorsque vous compilez et exécutez cela?:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *file;
    file = fopen("TestFile1.txt", "r");
    if (file == NULL) {
      perror("Error");
    } else {
      fclose(file);
    }
}


0 commentaires

1
votes

En plus de ce qui précède, vous pourriez être intéressé par l'affichage de votre répertoire actuel:

int MAX_PATH_LENGTH = 80;
char* path[MAX_PATH_LENGTH];
getcwd(path, MAX_PATH_LENGTH);
printf("Current Directory = %s", path);


0 commentaires

1
votes

Essayez d'utiliser un chemin absolu pour le nom de fichier. Et si vous utilisez Windows, utilisez getlasterror () pour voir le message d'erreur réel.


0 commentaires