2010-04-01 2 views
3

Voici mon code qui vérifie si le fichier existe:question sur l'existence de fichier dans C

#include<stdio.h> 
#include<zlib.h> 
#include<unistd.h> 
#include<string.h> 


int main(int argc, char *argv[]) 
{ 
    char *path=NULL; 
    FILE *file = NULL; 
    char *fileSeparator = "/"; 
    size_t size=100; 
    int index ; 
    printf("\nArgument count is = %d", argc); 

    if (argc <= 1) 
    { 
     printf("\nUsage: ./output filename1 filename2 ..."); 
     printf("\n The program will display human readable information about the PNG file provided"); 
    } 
    else if (argc > 1) 
    { 
     for (index = 1; index < argc;index++) 
     { 
      path = getcwd(path, size); 
      strcat(path, fileSeparator); 
      printf("\n File name entered is = %s", argv[index]); 
      strcat(path,argv[index]); 
      printf("\n The complete path of the file name is = %s", path); 
      if (access(path, F_OK) != -1) 
      { 
        printf("File does exist"); 
      } 
      else 
      { 
        printf("File does not exist"); 
      } 
      path=NULL; 
     } 
    } 
    return 0; 
} 

En exécutant la commande ./output test.txt test2.txt La sortie est:

$ ./output test.txt test2.txt 

Argument count is = 3 
File name entered is = test.txt 
The complete path of the file name is = /home/welcomeuser/test.txt 
File does not exist 
File name entered is = test2.txt 
The complete path of the file name is = /home/welcomeuser/test2.txt 
File does not exist 

maintenant test.txt existe sur le système:

$ ls 
assignment.c output.exe output.exe.stackdump test.txt 

et encore test.txt est présenté comme un fichier existant non.

S'il vous plaît aidez-moi à comprendre le problème ici. Aussi, n'hésitez pas à poster des suggestions pour améliorer le code/éviter un bug.

Cordialement, Darkie

+2

Vous avez toujours pas résolu les problèmes de défaut de segmentation que vous aviez dans votre dernière question. Vous pourriez vouloir corriger cela, juste parce qu'il ne plante pas ne signifie pas qu'il fonctionne correctement. – SoapBox

+0

Salut SoapBox, Je crois que le défaut Seg était parce que la taille n'a pas été définie avec une valeur. Je l'ai assigné à 100. S'il vous plaît laissez-moi savoir s'il y a quelque chose de plus. –

+0

Vous devriez vérifier la valeur dans errno après l'appel d'accès pour comprendre pourquoi il pense qu'il n'existe pas. Oh et allouer un peu d'espace pour le chemin aussi. – Craig

Répondre

2

Tout simplement parce que l'appel à access() tombe en panne ne signifie pas que le fichier n'existe pas. L'appel pourrait échouer pour d'autres raisons.

Utilisez printf("error:%s\n", strerror(errno)); pour imprimer le texte du message d'erreur.

De plus, vous ajoutez toujours de manière incorrecte le "chemin" reçu de getcwd comme vous l'avez fait dans votre précédente question. Même s'il ne plante pas, il n'est toujours pas correct et pourrait vous causer des problèmes ... peut-être même le problème que vous avez maintenant. Getcwd() alloue un tampon pour votre chemin, mais ce tampon est seulement dimensionné pour s'adapter au chemin. vous ajoutez à ce tampon, dépassant la fin. C'est mauvais, vous ne pouvez pas faire ça. Cela causera des problèmes et, occasionnellement, des plantages. vous devez faire une pause et comprendre comment fonctionne cette fonction getcwd et comment l'utiliser correctement.

+0

+1, mais 'perror()' est un moyen plus simple d'obtenir la chaîne d'erreur. –

+0

Hi SoapBox, J'ai ajouté un nouveau tableau char et ai copié la valeur stockée par la variable existante 'path' dans ce tableau char en utilisant strcpy. Maintenant, j'ai utilisé ce tableau char pour toutes les autres opérations. Le code fonctionne maintenant comme requis. Pensez-vous qu'il y a quelque chose de plus que je devrais examiner? Merci pour votre patience. Cordialement, darkie –

0

Je suggère fortement allouer assez de place pour stocker le chemin via malloc() et fpathconf() (indice, PATH_MAX).

Une façon non standard de l'allouer et de l'assembler serait asprintf(). Assurez-vous de libérer le chemin résultant quand il n'est plus nécessaire, et vérifiez tous les appels qui pourraient échouer en raison de fautes de frappe de l'utilisateur. Si vous utilisez malloc(), vérifiez toujours l'échec (le résultat étant NULL).

Bonne chance avec votre mission :)