IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Soucis avec fgets et retour charriot


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 3
    Par défaut Soucis avec fgets et retour charriot
    Bonsoir,

    je débute en c et je rencontre quelques problèmes... j'espère que quelqu'un pourra m'aider à y remédier. Alors j'explique ! J'essaye de prélever un mot dans une liste de mots et d'en faire le nom d'un nouveau fichier. Mon code donne un truc dans ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main() {
    FILE *f1 = fopen("azerty.txt", "r"); // azerty contient une liste de mots
    char mot[50];
    char * extension = ".txt";
    fgets(mot, 50, f1);
    strcat(mot, extension);
    FILE *f2 = fopen(mot, "w");
    }
    Alors le problème c'est que ça compile bien, mais aucun fichier ne se crée. J'ai cogité quelques minutes et je crois avoir compris que fgets recopie aussi le \n à la fin de chaque mot dans ma liste de mots, car quand je fais un printf("%s", mot) ça m'affiche:
    Donc si j'ai bien compris ma chaine de caractère mot doit donner un truc comme "mot\n.txt" et c'est pour ça que ça crée pas le fichier je pense... donc j'aimerais bien faire en sorte de virer le \n au milieu mais je ne vois pas comment faire, j'ai essayé plein de trucs en vain

    Plz help

  2. #2
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Par défaut
    Si tu veux continuer de travailler avec fgets, il te suffit après acquisitions des chaines de caractères, de les traiter.

    Comme tu l'as dis, il faut retirer ne '\n'. Pour faire ça tu peux :

    - créer une nouvelle chaine de caractère malloquée avec assez d'espace (la même taille que le string d'origine moins 1, car tu ne copies pas le '\n')
    - copier l'ancienne chaine dans la nouvelle du moment que ce n'est pas un '\n' ou un '\0' (il y a toute la logique dans la phrase )
    - ajouter en fin de la nouvelle chaine le '\0'
    - utiliser cette nouvelle chaine comme nom de fichier, normalement ça devrait marcher.

    Si ça ne marche pas poste nous ta tentative !

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 3
    Par défaut
    Merci pour la réponse, alors j'ai essayé ta méthode mais j'ai du me tromper quelque part car ça me fait un problème d'erreur de segmentation je crois

    Voilà ce que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    int main() {
    int k=0;
    FILE *f1 = fopen("azerty.txt", "r"); // azerty contient une liste de mots
    char * mot;
    char * extension = ".txt";
    fgets(mot, 50, f1);
     
    char * mot_sans_n = malloc((strlen(mot)-1)*sizeof(char));
    while (mot[k] != '\0'){
    	  if (mot[k] != '\n')
    	  {
    	  mot_sans_n[k] = mot[k];
          }
          k++;
      }
     
    char mot2[50];
    strcpy (mot2, mot_sans_n);
    strcat(mot2, extension);
    FILE *f2 = fopen(mot, "w");
    }

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Inutilement compliqué de faire une nouvelle chaine :
    - Rechercher la position d'un éventuel '\n' dans mot (il peut ne pas y en avoir si la ligne était trop longue pour entrer dans mot) en utilisant strchr() et le remplacer par 0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char *p;
    ....
    fgets(mot, 50, f1);
    p = strchr(mot,'\n');
    if(p!= NULL) *p = '\0';
    ....

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    ceci va planter : mot doit être un tableau pour pouvoir stocker la chaine lue par fgets(). Ici il n'est qu'un simple pointeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char * mot;
    char * extension = ".txt";
    fgets(mot, 50, f1);

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 3
    Par défaut
    Merci beaucoup ! Ca marche

    Je connaissais pas cette fonction strchr, pour le coup c'est bien utile
    Encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Soucis avec vbcrlf, chr(), vbnewline et le retour à la ligne
    Par mathieuq dans le forum VB.NET
    Réponses: 14
    Dernier message: 07/02/2013, 14h29
  2. Réponses: 6
    Dernier message: 25/10/2011, 15h52
  3. Souci avec le retour de find
    Par khayyam90 dans le forum Linux
    Réponses: 3
    Dernier message: 10/05/2006, 14h58
  4. [VBA-W] Ajouter un retour charriot
    Par FatalError dans le forum VBA Word
    Réponses: 3
    Dernier message: 18/12/2002, 15h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo