fopen() pour retourner un pointeur NULL, mais le fichier existe certainement
Le code que j'ai est comme suit:
FILE *txt_file = fopen("data.txt", "r");
if (txt_file == NULL) {
perror("Can't open file");
}
Le message d'erreur renvoyé est:
Ne pouvez pas ouvrir le fichier: Aucun fichier ou répertoire de
Le fichier 'data.txt" certainement il existe dans le répertoire de travail (il existe dans le répertoire qui contient mon .c et .h fichiers), alors pourquoi est-fopen() renvoie un pointeur NULL?
- êtes-vous en cours d'exécution à partir de la ligne de commande ou à partir d'un IDE? Si IDE, êtes-vous sûr que le programme de travail de répertoire est créé dans le répertoire contenant le fichier de données?
- pouvez-vous ajouter de la sortie de
ls -Fal
pour le répertoire en question? - vous avez peut-être n'avez pas la permission de l'ouvrir. êtes-vous sur linux?
- Pouvez-vous joindre le code entier?
- Quel est le répertoire courant de l'application? Avez-vous essayé avec un chemin absolu? Le fichier est ouvert en écriture par quelqu'un d'autre? Est-il d'un problème d'autorisations? Quel système d'exploitation et du système de fichiers est-ce?
- Je suis en cours d'exécution à partir d'un IDE: Visual Studio 2008. Je vais avoir pour la recherche de la façon de vérifier son répertoire de travail.
- Essayez le chemin d'accès complet:
#define FULLPATHTOFILES "C:\\Users\\Barjavel\\Projects\\source\\bin\\debug\\"
ettxt_file = fopen(FULLPATHTOFILES "data.txt", "r");
Avis j'ai fini le texte de macro avec un final'\'
- Vous pouvez obtenir le répertoire de travail en cours avec la _getcwd() fonction de l'utilisation que pour le débogage et l'apprentissage du répertoire de travail Visual Studio exécute votre programme en.
- Je suis sur Windows 7. J'ai essayé le chemin d'accès absolu, de la forme "C:/User/SomeProject/source/bin/debug/somedirectory" qui renvoie la même erreur.
Vous devez vous connecter pour publier un commentaire.
Est-il possible que le nom de fichier n'est pas vraiment "data.txt"?
Sur Unix, les noms de fichiers sont vraiment chaînes d'octets sont pas des chaînes de caractères, et il est possible de créer des fichiers avec des contrôles tels que des retour arrière dans leurs noms. J'ai vu des cas dans le passé où le copier-coller dans les terminaux a entraîné dans des fichiers avec l'ordinaire, à la recherche de noms, mais en essayant d'ouvrir le fichier apparaît dans une liste de répertoires entraîne une erreur.
Une façon de dire à coup sûr que les noms de fichier sont vraiment ce que vous pensez qu'ils sont:
Un problème Standard. Essayez
I. e. essayez de l'ouvrir avec le plein de chemin d'accès absolu en premier ; si cela fonctionne, alors vous avez juste à comprendre ce que le répertoire courant est avec
_getcwd()
et puis réparer votre chemin d'accès relatif.Mon problème était que j'avais un fichier filename.txt et je ne savais pas qu'en réalité c'était filename.txt.txt parce que windows ne montre pas l'extension.
Assurez-vous que votre fichier d'entrée est dans le même répertoire que l'exécutable, qui peut être différent de celui où vos fichiers d'origine sont conservés. Si vous exécutez le programme dans un IDE débogueur, assurez-vous que votre répertoire de travail est fixé à l'emplacement du fichier d'entrée. Aussi, si vous êtes en cours d'exécution sous *nix plutôt que de Windows, vous devrez peut-être ajouter un "./" pour le fichier d'entrée.
./
à un nom de fichier passé àfopen()
sur UNIX.Invisible caractère d'ESPACE dans un nom de fichier?
Une fois par an, j'ai un problème similaire:
J'essaie d'ouvrir un fichier avec le nom de fichier dans une chaîne de caractères obtenue à partir d'une opération de piqûre. Lorsque j'imprime le nom, cela semble OK, mais fopen() renvoie un pointeur null. La seule aide est l'impression du nom avec des séparateurs affichant le début et la fin du nom de fichier de la chaîne. Bien sûr, cela n'aide pas avec les caractères non imprimables.
J'ai juste eu un problème similaire comme ça où je savais que le chemin d'accès est correct et que le fichier est au bon endroit. Vérifiez les autorisations de fichier. Il est possible que le programme ne peut pas accéder au fichier car ce fichier est d'obtenir la permission refusée.
J'ai rencontré le même errno à fopen sur Linux à partir d'un fichier de script corrompu par Windows.
ENOENT 2 Aucun fichier ou répertoire
Wordpad sous Windows (ou un autre Microsoft coupable) inséré CRLF = (0x0D, 0x0A) sur mon linux, les fichiers de script à la place de saut de ligne = LF = 0x0A. Quand j'ai lu le nom du fichier dans un buffer, et appelé fopen si a échoué en raison de l'invisible ajouté caractère CR.
Dans le Codelite de l'éditeur sur Linux Mint, j'ai été en mesure de montrer les caractères de fin de ligne (EOL (Affichage > Affichage de fin de ligne (EOL) et de les supprimer grâce à la fonction rechercher et remplacer, en utilisant le copier-coller de la CRLF de l'corrompu des fichiers de script et la LF à partir d'un non corrompus fichier dans le champs de texte.