Gestion de retour a la ligne avec fgets [Résolu/Fermé]

Signaler
Messages postés
27
Date d'inscription
vendredi 22 mars 2019
Statut
Membre
Dernière intervention
29 février 2020
-
Messages postés
5394
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
31 juillet 2020
-
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

Messages postés
5394
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
31 juillet 2020
891
Salut marie12_2000 ,

Il y a une faute de frappe à
fclose()


Si tu veux lire une ligne avec
fgets()
, tu vas devoir lire les
char
contenus dans chaque ligne, dans ton cas 6 : les 5 lettres de tes mots, plus le retour à la ligne
'\n'
qui est un
char
lu par
fgets()
:

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.

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.

Le tableau de char
mot
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
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 58167 internautes nous ont dit merci ce mois-ci

Messages postés
27
Date d'inscription
vendredi 22 mars 2019
Statut
Membre
Dernière intervention
29 février 2020

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
Messages postés
27
Date d'inscription
vendredi 22 mars 2019
Statut
Membre
Dernière intervention
29 février 2020

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;}
Messages postés
5394
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
31 juillet 2020
891
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 tes
printf()
, 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
Messages postés
27
Date d'inscription
vendredi 22 mars 2019
Statut
Membre
Dernière intervention
29 février 2020

ah bah excusez moi monsieur DAL ! :3
Messages postés
5394
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
31 juillet 2020
891
Lol @ monsieur, pas de problème ;-)