2010-03-30 4 views
0

Est-ce sûr à faire? Est-ce que fgets met fin à la mémoire tampon avec null ou devrais-je définir le 20ème octet à null après l'appel à fgets et avant que j'appelle clean?Est-ce que fgets() met toujours fin à la chaîne retournée?

// strip new lines 
void clean(char *data) 
{ 
    while (*data) 
    { 
     if (*data == '\n' || *data == '\r') *data = '\0'; 
     data++; 
    } 
} 

// for this, assume that the file contains 1 line no longer than 19 bytes 
// buffer is freed elsewhere 
char *load_latest_info(char *file) 
{ 
    FILE *f; 
    char *buffer = (char*) malloc(20); 
    if (f = fopen(file, "r")) 
     if (fgets(buffer, 20, f)) 
     { 
      clean(buffer); 
      return buffer; 
     } 
    free(buffer); 
    return NULL; 
} 

Répondre

3

Oui fgets() toujours correctement null-tampon se termine. De l'man page:

Les fgets() fonction lit au plus un de moins que le nombre de caractères spécifiés par n du flux donné et les stocke dans la chaîne s. La lecture s'arrête lorsque un caractère de retour à la ligne est trouvé, en fin de fichier ou erreur. La nouvelle ligne, le cas échéant, est conservée. Si des caractères sont lus et qu'il n'y a pas d'erreur, un caractère '\0' est ajouté pour terminer la chaîne.

0

S'il y a une erreur, fgets() peut ou non stocker des octets zéro n'importe où dans le tampon. Le code qui ne vérifie pas la valeur de retour de fgets() ne sera pas sûr à moins de s'assurer qu'il y a un zéro dans le buffer quelque part; la façon la plus simple de le faire est de stocker inconditionnellement un zéro à la dernière place. Cela signifiera qu'une erreur non détectée peut (en fonction de l'implémentation) provoquer une fausse ligne de données supplémentaire à lire, mais ne tombera pas dans un comportement indéterminé.

Questions connexes