Menu

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

Messages postés
17
Date d'inscription
vendredi 22 mars 2019
Statut
Membre
Dernière intervention
11 avril 2019
-
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>
Afficher la suite 

1 réponse

Meilleure réponse
Messages postés
5135
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
24 juin 2019
778
2
Merci
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

Dire « Merci » 2

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 45535 internautes nous ont dit merci ce mois-ci

marie12_2000
Messages postés
17
Date d'inscription
vendredi 22 mars 2019
Statut
Membre
Dernière intervention
11 avril 2019
-
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
marie12_2000
Messages postés
17
Date d'inscription
vendredi 22 mars 2019
Statut
Membre
Dernière intervention
11 avril 2019
-
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;}
[Dal]
Messages postés
5135
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
24 juin 2019
778 -
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
marie12_2000
Messages postés
17
Date d'inscription
vendredi 22 mars 2019
Statut
Membre
Dernière intervention
11 avril 2019
-
ah bah excusez moi monsieur DAL ! :3
[Dal]
Messages postés
5135
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
24 juin 2019
778 -
Lol @ monsieur, pas de problème ;-)
Commenter la réponse de [Dal]