2017-09-23 6 views
-2

Ok, je commencerai par dire que je crée un serveur web. Et j'ai une fonction getFileContent j'utiliser pour obtenir mon contenu de mes fichiers qui ressemble à ceciComportement inattendu du fichier de lecture de fonction dans C

char* getFileContent(char *filename) 
{ 
    long length; 
    char *buffer; 
    FILE *f = fopen (filename, "r"); 
    if (f) { 
     fseek (f, 0, SEEK_END); 
     length = ftell (f); 
     fseek (f, 0, SEEK_SET); 
     buffer = malloc (length + 1); 
     if (buffer) { 
      fread (buffer, 1, length, f); 
     } 
     fclose (f); 
    } 

    if (buffer != 0) { 
     return buffer; 
    } else { 
     return NULL; 
    } 
} 

Et lorsque vous appelez cette fonction que je reçois un comportement bizarre.
Si je l'appelle seulement une fois que cette
char *fileContent = getFileContent(path);
par exemple quand je reçois le ContenuFichier pour revenir, il ajoute un 2 ou 3 caractères étranges.
Mais si je l'appelle deux fois pour la même variable, il ajoute un autre ensemble de caractères étranges.

Cependant, si j'appelle la fonction une troisième fois, au début du programme, dans main. En obtenant par exemple le contenu de /etc/hosts/ dans une variable complètement différente et inutilisée, il imprime la sortie normalement plus tard dans le code.

J'ai essayé de voir le problème mais il semble si aléatoire et j'apprécierais vraiment si quelqu'un pourrait m'aider avec lui.

+1

Puis la fin de votre fonction pourrait être remplacée par juste 'return buffer;'. –

+0

Si l'ouverture du fichier échoue, vous lisez la valeur non initialisée de 'buffer'. Le compilateur devrait pouvoir vous avertir à ce sujet ... –

Répondre

1

Quand vous lisez le contenu du fichier, votre tampon est pasNUL terminé. Donc, si vous le traitez comme un C-string (par exemple printf), vous invoquez un comportement indéfini.

Vous devez vérifier la valeur de retour fread et placer un '\0' après le dernier octet lu.