Gestion de retour a la ligne avec fgets
Résolu
marie12_2000
Messages postés
29
Statut
Membre
-
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
bonjour, Bonjour, j'arrive pas a enlever les \n après utilisation de la fonction fgets je galère beaucoup avec les fichiers (je débute) voici un exemple simple sans même que je n'ai a faire printf("%s \n",mot) ça se fait comme ça, on comprend que je n'ai pas réussi a me débarrasser des \n même si j'ai précisé que le nombre maximale des lettres a copier était 6 (5 lettres plus le \0) sachant que je travaille uniquement avec des mots de 5 lettres
<code>#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fich;
char mot[30];
fich=fopen("fichier.txt","w");
fprintf(fich,"ecole\n");
fprintf(fich,"fleur\n");
fprintf(fich,"jeudi\n");
fcolse(fich);
fich=fopen("fichier.txt","r");
while((fgets(mot,6,fich))!=NULL)
{
printf("%s",mot);
}
return 0;
}</code>
1 réponse
-
Salut marie12_2000 ,
Il y a une faute de frappe àfclose()
Si tu veux lire une ligne avecfgets()
, tu vas devoir lire leschar
contenus dans chaque ligne, dans ton cas 6 : les 5 lettres de tes mots, plus le retour à la ligne'\n'
qui est unchar
lu parfgets()
:
http://www.cplusplus.com/reference/cstdio/fgets/
A newline character makes fgets stop reading, but it is considered a valid character by the function and included in the string copied to str.
Commefgets()
arrête sa lecture lorsqu'un'\n'
est rencontré, tu peux passer en 2ème argument defgets()
la taille de ton tableau dechar
avec un simplesizeof mot
, qui indiquera àfgets()
le maximum dechar
pouvant être lus.
Le tableau de charmot
va donc contenir'\n'
, qu'il te faudra supprimer si tu n'en veux pas. Cela peut se faire de différentes façons, par exemple comme cela :
char *p; if ((p = strchr(mot, '\n')) != NULL) *p = '\0';strchr()
recherche l'existence d'un char dans une chaîne de caractères C, et si elle le trouve, elle retourne son adresse mémoire que tu peux stocker dans un pointeur. Avec ce pointeur, tu peux écraser le'\n'
dont tu ne veux pas, et le remplacer par'\0'
pour terminer ta chaîne à cet endroit.
Dal-
bonsoir, merci pour la réponse j'ai essayé ce que tu ma dit et voila on peut pas dire que ça marche vraiment
1) en précisant que le nombre maximum de caractères a copier était 5 sachant que je travaille avec des mots de 5 lettres je tiens a le rappeler
2)en précisant que le nombre maximum de caractères a copier était 6
3)en remplaçant les \n et en copiant collant ton code
-
excuse moi pour la troisième méthode c'est bon ça marche j'ai oublié de remplacer 5 par 6 mais pour le reste j'aimerais bien comprendre ce qui s'est passé s'il te plait et merci
voici le code correct au cas ou ça pourrait aider quelqu'un#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fich;
char mot[30];
char *p;
fich=fopen("fichier.txt","w");
fprintf(fich,"fleur\n");
fprintf(fich,"ecole\n");
fprintf(fich,"mardi\n");
fprintf(fich,"jeudi\n");
fclose(fich);
fich=fopen("fichier.txt","r");
while((fgets(mot,6,fich))!=NULL)
{
if ((p = strchr(mot,'\n')) != NULL)- p = '\0'; printf("%s ",mot); } return 0;}
-
Utilise les balises de code c, pas les balises génériques, sinon ton code n'est pas affiché correctement sur le forum.
Tu n'as pas le résultat attendu, car tu ne suis pas mes indications, en ne lisant pas la totalité de chaque ligne à chaque itération, et donc ton affichage est bizarre. Pourquoi ne fais-tu pas ce que je te conseille de faire ?
Comme fgets() arrête sa lecture lorsqu'un '\n' est rencontré, tu peux passer en 2ème argument de fgets() la taille de ton tableau de char avec un simple sizeof mot, qui indiquera à fgets() le maximum de char pouvant être lus.
donc écris :fgets(mot, sizeof mot, fich)
et cela t'évitera de lire tes lignes de façon incomplète à un ou deux caractères près, comme tu le fais ...
Ensuite, ta question initiale dans ce post est que tu lis les'\n'
et que tu n'en veux pas, tu dis :
je n'ai pas réussi a me débarrasser des \n
Je t'ai donc donné une solution à ce problème pour t'en débarrasser. Si, ensuite, tu veux afficher un mot par ligne, il te faudra bien sûr remettre un'\n'
dans tesprintf()
, donc :printf("%s\n",mot);, sinon, tu vas afficher les mots à la suite (sauf, si c'est ce que tu veux faire, mais c'est toi qui décide et ne te plaint pas que les mots s'affichent désormais à la suite si tu ne rajoute pas un retour à la ligne) ...
Je ne t'explique rien de nouveau, je crois ... :-)
Dal -
-
-