je déconseille strtok. Je ne sais pas ce que Emmanuel entend par réentrance, mais strtok altère la chaîne traîtée. A la limite, on s'en fiche, mais surtout, si tu as un champ vide (donc deux ';' à la suite), strtok considère qu'il n'y a qu'une séparation. et donc au final, ta ligne se retrouve amputé d'un champ du point de vue strtok.
Pour moi, tester la valeur de fgets ne suffit pas, il faut aussi regarder feof comme tu l'as fait. Par contre, tes conditions sont légèrement à changer car si la fin du fichier est atteinte en cours de ligne fgets peut quand même avoir récupéré des choses, et tu ne lirais pas cette dernière ligne avec :
while ((!feof(fd_o)) && fgets(ligne, sizeof(ligne), fd_o) != NULL)
il faut arrêter quand fgets retourne NULL et que feof renvoie != 0.
Effectivement parser une telle ligne ne m'a pas paru trop difficile. Puisque la mode est de laisser un peu réfléchir, je ne recopierai pas ce que j'ai fait (pour le moment )
Par ailleurs, la façon de coder est une question de goût. Par ex, ce que propose emmanuel, moi je trouve ça moyen car on imbrique vite des sections en codant ainsi. Autant traiter l'erreur de suite et sortir, et sinon continuer. Moi je ferais :
1 2 3 4 5 6 7 8
| if( (fp = fopen(...)) == NULL) {
erreur();
sortie();
}
while(fgets(..., ..., fp) != NULL) {
/* traitement */
} |
à toi de voir...
Partager