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 :

Lire un fichier.txt et le traduire en liste


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Lire un fichier.txt et le traduire en liste
    Bonjour,

    Je bloque sur cette question depuis 2 jours,et je n'y arrive pas.
    Pourriez vous s'il vous plait m'aider ?

    Voila j'ai un fichier txt de la forme:

    cause --->consequence
    a z,i,e
    b u
    c y,i

    Mon idée est de faire une liste de liste (avec a,b,c) et de faire des sous listes((la sous liste de a: z i e), (la sous liste de b: u), (la sous liste c: y i))

    Mais voila mon problème est que je n'arrive pas à séparer z,i,e (les virgules me posent problème) et donc je n'arrive pas à faire les sous listes.


    MERCI D'AVANCE

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    Si tu pouvais montrer ton code ça pourrait aider. Dis-nous à quel endroit ça bloque.
    Sinon à priori tout ce que tu as à faire c'est parcourir ta ligne en stockant dans chaque maillon de ta chaine ce qu'il y a entre les virgule. C'est pas plus compliqué qu'un simple while avec un if à l'interieur.
    "L'insanité consiste à répéter la même action dans l'espoir d'aboutir à un résultat différent" Albert Einstein
    ----------------------
    T.O.A.O 6-MarViN

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 82
    Points : 54
    Points
    54
    Par défaut
    Je ne sais pas si c'est la meilleur solution, mais tu peux toujours utiliser la fonction strstr.

    http://msdn.microsoft.com/en-us/libr...=vs.71%29.aspx

    Sinon, si tu es sûr que c'est invariablement de la forme : x,y,z, tu peux simplement parcourir ta ligne de 2 en 2, jusqu'à CRLF ou EOF avec un pointeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char *p = NULL;
    p = taLigne; // Pointeur sur le début de ta ligne
    int i = 0;
     
    for ( i = 0; *(p+i+1) != EOF && *(p+i+1) != "\r\n"; i = i+2 ) {
       taListe[index] = *(p+i); //taListe doit être un tableau de char
    }
    En espérant que cela puisse t'aider.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Merci de vos aides.
    Ici je joins le code que j'ai fais.
    J'ai utiliser string mais je ne suis pas sur.
    En fait dans mon fichier.txt, il ya :

    cause nom duree consequence
    a crise 12 b,i,p
    b famine 4 e
    c dispute 8 0
    ............ (le zero signifie sans consequence)

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    typedef struct noeud
    {
        int valeur;
        string consequence;
        struct noeud* suiv;
    }noeud;
    typedef noeud* liste;
     
     
    typedef struct noeudliste
    {
        int nb_sommets;
        char sommet;
        liste liste_transition;
        struct noeudliste* suiv;
    }noeudliste;
    typedef noeudliste* laliste;
     
     
    void lire_graphe ()
    {
        ifstream source_graphe ("fichier.txt") ; //nom du fichier
     
        int n_sommets;
        char cause;
        char nom[1000];
        int duree;
        string cons1[10];
     
        source_graphe >> n_sommets ;
        cout<<"Le nombre de sommet "<<n_sommets<<endl<<endl;
     
       noeudliste* k=new noeudliste;
            laliste l=k;
            l->nb_sommets=n_sommets;
            l->sommet=-1;
            l->liste_transition=NULL;
            l->suiv=NULL;
     
            noeud* y=new noeud;
            liste q=y;
            q->valeur=-1;
            q->suiv=NULL;
        if ( n_sommets > 0 )               // Lecture des arcs
        {
            source_graphe >> cause;
            int i=0;
            while ( (i<n_sommets-1) )
           {
                source_graphe >> nom ;
                source_graphe >> duree ;
                source_graphe >> cons1[0] ;
     
                if ( (tache>0)&&( n_sommets>0 ) )
                {
                    noeudliste* a=new noeudliste;
                    l->sommet=cause;
                    cout<<"SOMMET : "<<l->sommet<<endl;
                    l->suiv=NULL;
                    a=a->suiv;
     
                    noeud* b=new noeud;
                    liste j=NULL;
                    liste m=b;
                    l->liste_transition=m;
                    m->consequence=cons1[0];
     
                    j=m;
                    b=b->suiv;
                    b=NULL;
     
                    string h=m->consequence;
     
                }
     
               if(tache=='/0')
               {
                   return NULL ;
               }
                source_graphe >> tache ;
                i++;
            }
        }
     
    }
    merci d'avance

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Un des problèmes est que ton code est un mélange de C et de C++, ce qui oblige à compiler en C++ et non en C.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 82
    Points : 54
    Points
    54
    Par défaut
    En effet c'est plus du C++ que du C.

    Mais ne nous arrêtons pas à cela.

    Premier point et non des moindres : BALISES CODE!.

    Deuxièmement : Le compilateur ne dit rien? Y a plusieurs points étranges dans ton code. Pour n'en citer que quelques un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    noeudliste* k=new noeudliste;
    laliste l=k;
    Je ne sais pas si c'est ce que tu voulais faire. Mais j'ai l'impression que ca sert à rien. Un simple laliste l = new noeuliste; me semble correct.

    Même chose ici du coup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    noeud* y=new noeud;
    liste q=y;
    Un autre endroit que j'ai du mal à saisir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    noeudliste* a=new noeudliste;
    l->sommet=cause;
    cout<<"SOMMET : "<<l->sommet<<endl;
    l->suiv=NULL;
    a=a->suiv;
    Quand tu dis a=a->suiv; Tu t'attends à quoi? Parce que ça va rien faire sachant que "a" ne vaut rien puisque tu l'as juste déclaré.

    Un dernier pour la route :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    b=b->suiv;
    b=NULL;
    Tu "t'embêtes" à donner l'adresse de ta structure suivante à "b" mais tout de suite après tu le remets à zéro... Je ne suis pas sûr que ce soit ce que tu voulais faire.

    Pour finir utilise une boucle for qui serait plus appropriée ici je pense ( à cause du i++ à la fin ).

    N'hésite pas à revenir quand tu auras corrigé tout ça.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Voila j'ai corrigé mes erreurs, mais le soucis c'est:
    Quand je crée une fonction AFFICHELISTE il ne m'indique que la valeur de la derniere liste (c); alors que moi je veux qu'il m'indique a->b->c.

    Mais sinon je ne vois toujours pas pourquoi je n'arrive pas à caser chaque caractere dans une liste quand il y a des virgules.

    MERCI D'AVANCE


    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    typedef struct noeud
    {
        int valeur;
        string consequence;
        struct noeud* suiv;
    }noeud;
    typedef noeud* liste;
     
     
    typedef struct noeudliste
    {
        int nb_sommets;
        char sommet;
        liste liste_transition;
        struct noeudliste* suiv;
    }noeudliste;
    typedef noeudliste* laliste;
     
     
    void lire_graphe ()
    {
        ifstream source_graphe ("fichier.txt") ; //nom du fichier
     
        int n_sommets;
        char cause;
        char nom[1000];
        int duree;
        string cons1[10];
     
        source_graphe >> n_sommets ;
        cout<<"Le nombre de sommet "<<n_sommets<<endl<<endl;
     
            laliste l=new noeudliste;         //initialisation de la liste de liste
            l->nb_sommets=n_sommets;
            l->sommet=-1;
            l->liste_transition=NULL;
            l->suiv=NULL;
     
            liste q=new noeud;            //Initialisation de la sous liste 
            q->valeur=-1;
            q->suiv=NULL;
     
        if ( n_sommets > 0 )               // Lecture des arcs
        {
            source_graphe >> cause;
            int i=0;
            while ( (i<n_sommets-1) )
           {
                source_graphe >> nom ;
                source_graphe >> duree ;
                source_graphe >> cons1[0] ;
     
                if ( (tache>0)&&( n_sommets>0 ) )
                {
                    noeudliste* a=new noeudliste;       //cree la liste de liste a
                    a=l;
                    a->sommet=cause;
                    cout<<"SOMMET : "<<a->sommet<<endl;
     
                    noeud* b=new noeud;                //cree la sous liste de a
                    b=q;
                    a->liste_transition=b;
                    b->consequence=cons1[0];
                    b=b->suiv;
     
                   a=a->suiv;                              //a passe à l'élément suivant
     
                }
     
               if(tache=='/0')
               {
                   return NULL ;
               }
                source_graphe >> tache ;
                i++;
            }
        }
     
    }
    je ne sais pas en quoi consiste "balise code".

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 82
    Points : 54
    Points
    54
    Par défaut
    J'ai du mal à repérer l'erreur que tu veux corriger. Un aperçu de ton fichier "fichier.txt" faciliterai le tâche. Avec aussi ce que te renvoie ton programme.

    En attendant, je me répète, remplace ton while par un for, ca me paraît mieux approprié ici ( plus cla

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 82
    Points : 54
    Points
    54
    Par défaut
    J'ai du mal à repérer l'erreur que tu veux corriger. Un aperçu de ton fichier "fichier.txt" faciliterai le tâche. Avec aussi ce que te renvoie ton programme.

    En attendant, je me répète, remplace ton while par un for, ca me paraît mieux approprié ici ( plus clair ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i=0;
            while ( (i<n_sommets-1) ) {
    /*
    du code 
    */
     i++;
    }
    Devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for ( int i = 0; i <= n_sommets; i++ ) { // Attention C ne permet pas la déclaration de i dans le for!
    /*
    du code 
    */
    }
    Ensuite tant qu'à faire du C++, utilise un objet pour gérer tes listes/sous listes. Tu t'embêteras moins la vie je pense.

    PS : désolé du double post, fausse manip!

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Voila j'ai modifier mon code.
    Mais j'ai tout de même un petit problème :
    Après avoir créer la fonction qui lie le fichier.txt.
    Quand j'essaye de créer une fonction qui lie les listes elle ne lie que la dernière information.
    Je joint ici le fichier.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a crise 12 b,d,c
    b famine 4 a,c
    c dispute 8 0
    d guerre 45 c
    Moi je voudrai que ma fonction affiche la liste a->b->c->d (pour la liste de liste)
    Alors que ma fonction ne lie que d.

    Je pense que le problème vient de la première fonction qui parcours la liste crée pour mettre les informations prises dans le fichier.txt et comme après son parcours il s'arrete au dernier élément (il ne m'affiche pas la liste en entier).Mais je ne suis pas sur.

    Voila ce que j'obtiens dans ma premiere fonction :

    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
    Le nombre de sommet 4
     
    nom crise
    duree 12
    SOMMET : a
    cons1 b d c
     
    nom famine
    duree 4
    SOMMET : b
    cons1 a c
     
    nom dispute
    duree 8
    SOMMET : c
    cons1 0
    MERCI D'AVANCE

Discussions similaires

  1. [Débutant] Lire plusieurs fichiers txt dans un répertoire
    Par leneuf dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/10/2006, 12h39
  2. [JAR] Lire un fichier txt dans un Jar
    Par flzox dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 28/08/2006, 01h30
  3. Lire un fichier .TXT en donnant une URL
    Par Matt2094 dans le forum Langage
    Réponses: 9
    Dernier message: 03/05/2006, 14h35
  4. Lire un fichier txt par http (C sous Linux)
    Par sleg dans le forum Réseau
    Réponses: 4
    Dernier message: 18/10/2005, 11h07
  5. Réponses: 4
    Dernier message: 05/10/2004, 17h11

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