Gestion de retour a la ligne avec fgets

Résolu/Fermé
marie12_2000 Messages postés 27 Date d'inscription vendredi 22 mars 2019 Statut Membre Dernière intervention 29 février 2020 - Modifié le 22 mars 2019 à 12:12
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 25 mars 2019 à 10:33
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

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 22 mars 2019 à 14:30
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
marie12_2000 Messages postés 27 Date d'inscription vendredi 22 mars 2019 Statut Membre Dernière intervention 29 février 2020
22 mars 2019 à 21:48
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
0
marie12_2000 Messages postés 27 Date d'inscription vendredi 22 mars 2019 Statut Membre Dernière intervention 29 février 2020
22 mars 2019 à 21:53
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;}
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
25 mars 2019 à 10:11
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
0
marie12_2000 Messages postés 27 Date d'inscription vendredi 22 mars 2019 Statut Membre Dernière intervention 29 février 2020
25 mars 2019 à 10:24
ah bah excusez moi monsieur DAL ! :3
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
25 mars 2019 à 10:33
Lol @ monsieur, pas de problème ;-)
0