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 :

Erreur de lecture dans un fichier


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut Erreur de lecture dans un fichier
    J'ai crée une fonction qui écrit ce que contient le fichier tant que la ligne n'est pas égale a "[/END]", auquel cas, elle renverait -1. Seulement, chaque fois que j'utilise cette fonction, elle foire !

    Voici un code pour la tester :

    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
     
    #include <string>
    #include <fstream>
    #include <iostream>
    #include <sstream>
     
    int PASSAGE_FONCTION = 0;
     
    using namespace std;
     
    int lire(string *&line, string &avatar);
     
    int main(int argc, char *argv[])
    {
     
     
        string  *line;
        string avatar;
     
        int total_lignes = 0;
     
     
        total_lignes = lire(line, avatar);
        while (total_lignes != -1)
        {
            cout << avatar << " dit : " << endl;
     
     
            for (int i=0; i<total_lignes; i++)
                cout << line[i] << endl;
            total_lignes = lire(line, avatar);
        }
     
     
     
     
     
     
    }
     
     
     
    int lire(string *&line,string &s_avatar)
    {
        string buffer;
        ifstream f("dialogues.dlog");
     
     
        int n_lignes = 0;
     
        int j = 0;
     
        while (j<=PASSAGE_FONCTION)
        {
            getline(f, buffer);
            if (buffer == "[/END]")
               return -1;
            s_avatar = buffer.substr(buffer.find("[")+1, buffer.find("/")-1); //On lit l'avatar
     
     
            istringstream line_read(buffer.substr(buffer.find("Lignes=")+7, buffer.find("/")-1) ); //On lit le nb de lignes
     
            line_read >> n_lignes;
     
            if (j==PASSAGE_FONCTION) line = new string[n_lignes];
            for(int i = 0; (getline(f, buffer) && buffer != "[/" + s_avatar + "]"); i++)
            {
                line[i]= buffer;
     
     
            }
            j++;
        }
        f.close();
        PASSAGE_FONCTION++;
        return n_lignes;
     
    }



    Et le fichier dialogues.dlog contient ceci :
    [Melia/Lignes=4/Side=Left]
    La fusion nucléaire est un des deux types de réaction thermo-nucléaire.
    C'est un processus où deux noyaux atomiques s'assemblent pour former un noyau plus lourd.
    La fusion de noyaux légers dégage d'énormes quantités d'énergie provenant du défaut de masse (cf. énergie de liaison).
    Cette réaction est à l'œuvre dans le soleil et toutes les étoiles de notre univers.
    [/Melia]
    [Solas/Lignes=5/Side=Right]
    Bien que chargés positivement et se repoussant d'après la loi de Coulomb,
    deux noyaux peuvent se percuter et leur collision entraîner une réaction de fusion nucléaire,
    si les noyaux se rapprochent à une distance inférieure ou égale à leur diamètre. Pour cela,
    ils doivent se trouver dans un état d'agitation thermique très élevé (voir plus bas : Plasmas de fusion).
    Au sein du soleil par exemple, la température atteint 15 millions de degrés Celsius pour réaliser la fusion de l'hydrogène en hélium.
    [/Solas]
    [Melia/Lignes=2/Side=Right]
    Dans certaines étoiles plus massives, des températures plus élevées, permettent la fusion de noyaux plus lourds.
    Cette température élevée permet en fait le franchissement de la barrière de potentiel coulombien (répulsion des noyaux) par effet tunnel.
    [/Melia]
    [Solas/Lignes=4/Side=Right]
    Lorsque de petits noyaux fusionnent, le noyau résultant se trouve dans un état instable et doit
    décroître vers un état stable en émettant une particule (photon, électron ou autre).
    Une partie de l'énergie excédentaire est transmise à la particule émise sous forme d'énergie cinétique.
    L'autre partie est libérée sous forme de chaleur (réaction exothermique) et forme ainsi une chaîne qui s'auto-entretient.
    [/Solas]

    [/END]

    Vous remarquer que la fonction ne lit meme pas lel fichier jusqu'au bout

    Merci de votre aide, ca fait deux jour que je bloque la dessus, ca devient un peu ch***
    acieroid

  2. #2
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    Bon déjà juste en exécutant ton code me jette une exception à la ligne ou tu lis le nombre de ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    istringstream line_read(buffer.substr(buffer.find("Lignes=")+7, buffer.find("/")-1) );
    EDIT : bon il ne me le jette plus ??!!

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu devrais déjà tester le retour des tes fonctions du genre substr ou find.

    Ensuite je ne vois aucune allocation pour le tableau que tu vas renvoyer. (EDIT : oups ça y est je l'ai vu )

    Et enfin, je pense que le mieux serait de définir les structures appropriées au contenu de ton fichier, et de renvoyer un tableau de ces structures, en un seul appel à la fonction.

  4. #4
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    Au lieu d'utiliser des pointeurs de string, tu pourrais utiliser une string tout court ?

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Tipoun
    Au lieu d'utiliser des pointeurs de string, tu pourrais utiliser une string tout court ?
    C'est un tableau, donc plutôt un vector de string.

  6. #6
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    Effectivement

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Un vector de string ?

  8. #8
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Je ne vois pas vraiment comment je dois l'utiliser, je fait un vector a la place de " line "(qui est un pointeur), il faut donc faire un pointeur, il y aurait pas une facon plus facile, ou bien , vous pourvez me montrer un code adapté a ce que je fait sur le string( susbstr, find, ..)

  10. #10
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    Ta fonction lire sera comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef vector <string> VString;
    int lire(VString & vecteur, string & avatar);
    Pour ajouter une valeur tu fait vecteur.push_back("blabla")

    Il y a plus d'info sur la FAQ, si tu as un prob n'hésite pas

Discussions similaires

  1. Erreur de lecture dans un fichier
    Par jagboys dans le forum MFC
    Réponses: 3
    Dernier message: 20/01/2008, 21h08
  2. Lecture dans un fichier
    Par unknown4 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 14/08/2005, 18h56
  3. [Débutant] Lecture dans un fichier texte
    Par babemagus dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 07/07/2005, 13h17
  4. erreur d'ecriture dans un fichier
    Par fjp dans le forum C++Builder
    Réponses: 4
    Dernier message: 03/07/2005, 12h31
  5. Réponses: 12
    Dernier message: 14/06/2004, 14h06

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