Si l'on suppose le FILE * est valide, pensez à:Est-ce que fgets peut lire une chaîne vide?
char buf[128];
if(fgets(buf,sizeof buf,myFile) != NULL) {
strlen(buf) == 0; //can this ever be true ? In what cases ?
}
Si l'on suppose le FILE * est valide, pensez à:Est-ce que fgets peut lire une chaîne vide?
char buf[128];
if(fgets(buf,sizeof buf,myFile) != NULL) {
strlen(buf) == 0; //can this ever be true ? In what cases ?
}
Oui. En plus de passer 1 (comme noté par Ignacio), fgets
ne fait aucune manipulation spéciale pour les nulls incorporés. Donc, si le prochain caractère dans le FILE *
est NUL, strlen
sera 0. C'est une des raisons pour lesquelles je préfère la fonction POSIX getline. Il renvoie le nombre de caractères lus afin que les NULL incorporés ne posent pas de problème.
De la page man fgets(3)
:
DESCRIPTION
fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A '\0' is stored after the last character in the buffer.
...
VALEUR DE RETOUR
...
gets() and fgets() return s on success, and NULL on error or when end of file occurs while no characters have been read.
De là, on peut déduire qu'une size
de 1
le fera lire une chaîne vide. L'expérimentation ici le confirme.
Incidemment, un size
de 0
semble ne pas modifier du tout le tampon, même en mettant dans \0
.
+1, cela semble correct. – casablanca
si la taille de la mémoire tampon est nulle, il n'y a pas de place pour 'fgets()' pour écrire le terminal null, n'est-ce pas? Il ne peut pas écrire au-delà de la fin de l'espace qui lui est donné; si on ne lui donne pas d'espace, il ne peut pas écrire. –