web-dev-qa-db-fra.com

fopen () renvoie un pointeur NULL, mais le fichier existe définitivement

Le code que j'ai est le suivant:

FILE *txt_file = fopen("data.txt", "r");
if (txt_file == NULL) {
    perror("Can't open file");
} 

Le message d'erreur renvoyé est:

Impossible d'ouvrir le fichier: Aucun fichier ou répertoire de ce type

Le fichier 'data.txt' existe définitivement dans le répertoire de travail (il existe dans le répertoire contenant mes fichiers .c et .h), alors pourquoi fopen () renvoie-t-il un pointeur NULL?

15
Barjavel

Est-il possible que le nom de fichier ne soit pas vraiment "data.txt"?

Sous Unix, les noms de fichiers sont en réalité des chaînes d'octets et non des chaînes de caractères. Il est donc possible de créer des fichiers avec des commandes telles que le retour arrière dans leurs noms. J'ai déjà vu des cas dans lesquels le copier-coller dans des terminaux donnait des fichiers avec des noms ordinaires, mais essayer d'ouvrir le nom du fichier qui apparaît dans une liste de répertoires était une erreur.

Une façon de dire avec certitude que les noms de fichiers sont vraiment ce que vous pensez être:

$ python
>>> import os
>>> os.listdir('.')
7
wberry

Problème standard. Essayer

FILE *txt_file = fopen("C:\\SomeFolder\\data.txt", "r");

C'est à dire. essayez d'abord de l'ouvrir avec le chemin absolu complet; si cela fonctionne, il vous suffit de déterminer le répertoire actuel avec _getcwd(), puis de fixer votre chemin relatif.

11
Jacob

Mon problème était que j'avais un fichier filename.txt et que je n'avais pas réalisé que c'était en réalité filename.txt.txt car Windows ne montrait pas l'extension.

3
Janne

Caractère SPACE invisible dans le nom du 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, obtenue à partir d'une opération sting. Quand j'imprime le nom, cela semble correct, mais fopen () renvoie un pointeur null. La seule aide consiste à imprimer le nom avec des délimiteurs indiquant le début et la fin exacts de la chaîne de nom de fichier. Bien sûr, cela n’aide pas les caractères non imprimables.

2
karsten

Assurez-vous que votre fichier d'entrée se trouve dans le même répertoire que l'exécutable, ce qui peut être différent de celui où vos fichiers source sont conservés. Si vous exécutez le programme dans un débogueur IDE, assurez-vous que votre répertoire de travail est défini sur l'emplacement du fichier d'entrée. De plus, si vous utilisez * nix plutôt que Windows, vous devrez peut-être ajouter un "./" au nom de fichier en entrée.

2
Kevin D.

Je viens d'avoir un problème similaire comme celui-ci où je savais que le chemin était correct et que le fichier était au bon endroit. Vérifiez les autorisations de fichier. Il est possible que le programme ne puisse pas accéder au fichier car son autorisation est refusée. 

0
Nautilus