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 :

Sale problème avec les strings et les fichiers


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 Sale problème avec les strings et les fichiers
    J'ai un problème que je n'arrive pas a résoudre, j'ai essayé toutes les solutions possibles, au point de revenir en console, mais le problème est toujours la, je ne comprend meme pas ou ca bugge, voila le code console :

    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
     
     
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    #include <fstream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        srand(time(NULL));
        string fichier;
     
     
        char buffer[2000] ;
        string line[5];
        int fin_ligne =0, debut_ligne = 0;
        //Lecture du contenu du fichier est écriture dans la chaine fichier
        ifstream f ("dialogues.dlog");
        f.getline(buffer, 2000, '$'); 
        fichier = buffer;
        f.close();
     
        for (int i=0; i<5; i++)
        {        
            fin_ligne = fichier.find('&', debut_ligne)-1;
            line[i] = fichier.substr(debut_ligne, fin_ligne); 
            debut_ligne = fin_ligne+2;
            cout << line[i] << endl<<endl<<endl;
        }   
     
     
     
     
     
        cout << endl ;
        system("PAUSE");
        return 0;
     
    }

    Evidemment, pour lancer, il faut un fichier dialogues.dlog qui contient du texte, un passage a la logne équivaut a un ' & ' et on place un ' $ ' a la fin du fichier, et tout le fichier tient sur une ligne (faute de bug)...

    Voila le contenu du fichier que j'utilise : (contentez vous de faire copier coller)
    Présentation. & Sphere of Kseira, qu’est-ce que c’est ? & C’est un projet RPG 2D iso, débuté le 1 janvier 2006. Un projet assez simple, même s'il va nous pendre du temps, beaucoup de temps. & Pas de date de prévu bien sur, vu que nous sommes tous amateur dans l'équipe. & - Et sa parle de quoi le jeu ? & Sur le monde de Martalya vivaient, il y a bien longtemps, les Anciens. & Ils ont bâtis toute la civilisation humaine, mais aussi ce que l'on nomme a présent "La barrière des Anciens". & Celui qui essaye de la traverser se fait immédiatement soustraire le Kseira de son corps. &$$$
    Je n'affiche que 5 lignes, je pourrais en afficher plus
    Voila ce que le mode console m'affiche :


    Présentation

    Sphere of Kseira, qu’est-ce que c’est ? & C’est un pro

    C’est un projet RPG 2D iso, débuté le 1 janvier 2006. Un projet assez simple, même s'il va nous pendre du temps, beaucoup de temps. & Pas de date de prévu bien sur, vu que nous sommes tous

    Pas de date de prévu bien sur, vu que nous sommes tous amateur dans l'équipe. & - Et sa parle de quoi le jeu ? & Sur le monde de Martalya vivaient, il y a bien longtemps, les Anciens. & Ils ont bâtis toute la civilisation humaine, mais aussi ce que l'on nomme a présent

    Et sa parle de quoi le jeu ? & Sur le monde de Martalya vivaient, il y a bien longtemps, les Anciens. & Ils ont bâtis toute la civilisation humaine, mais aussi ce que l'on nomme a présent "La barrière des Anciens". & Celui qui essaye de la traverser se fait immédiatement soustraire le Kseira de son
    Il y a surement un problème avec la variable ' fin_ligne ' vu que le début des lignes s'affiche bien, mais pas la fin

    Merci pour votre aide

    ---------
    acieroid

  2. #2
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Bonsoir,

    Tu peux éviter d'utiliser une string. Le tableau de caractéres est bien suffisant.
    La recherche dans la string est couteuse pour la machine.

    Tu pourrais directement afficher ton tableau de caractéres en remplaçant directement le '&' par le retour à la ligne comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char Buffer [2000];
    ifstream Fic ("test.txt");
    Fic.getline(Buffer , 2000, '$');
    for (unsigned i (0); Buffer [i] != '\0'; ++i)
        if (Buffer [i] != '&')
            cout << Buffer [i];
        else
            cout << "\n\n";
     
    system("PAUSE");

  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 : 39
    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 peux éviter d'utiliser une string. Le tableau de caractéres est bien suffisant.
    La recherche dans la string est couteuse pour la machine.
    Conseil très doûteux... Revenir aux char[] et à tous les problèmes liés, pour des raisons de soi-disante rapidité (à prouver), c'est plutôt limite.

    Sinon, le code est inutilement compliqué, et tu n'a pas besoin des char[].

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    string Buffer, Line;
    ifstream Fic ("test.txt");
    getline(Fic, Buffer, '$');
     
    istringstream iss(Buffer);
     
    while (getline(iss, Line, &))
        cout << Line << endl;

  4. #4
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Ah oui, effectivement c'est plus simple avec des string.
    Mais comment se passe l'injection des string dans le flux ?

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Tipoun
    Mais comment se passe l'injection des string dans le flux ?
    ??? Pas compris la question...
    C'est cette ligne là :
    que tu ne comprends pas ?

  6. #6
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Non, escuse moi j'ai mal formulé ma question...

    Comment se passe l'injection de la string à un trés bas niveau ?

    Est-ce que l'opérateur << injecte chaque valeur héxadécimale dans le flux en parcourant la chaine ou il injecte tout d'un seul coup ?

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Il recopie la chaîne de caractères sur le flux.

  8. #8
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Citation Envoyé par Tipoun
    Est-ce que l'opérateur << injecte chaque valeur héxadécimale dans le flux en parcourant la chaine ou il injecte tout d'un seul coup ?
    Les flots STL d'e/s sont bufferisés (via les streambuf internes), si c'est de ça que tu veux parler.

  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
    Citation Envoyé par Loulou24

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    istringstream iss(Buffer);

    Le compilo plante la dessus :
    error: variable `std::istringstream iss' has initializer but incomplete type

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Bonjour,

    Tu as fais #include <sstream> ?

    ++

  11. #11
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    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 #include <sstream>
    Le compilo plante la dessus :
    Citation:
    error: variable `std::istringstream iss' has initializer but incomplete type
    Tu as du oublié d'inclure le fichier sstream qui gére les stringstreams.

    Les flots STL d'e/s sont bufferisés (via les streambuf internes), si c'est de ça que tu veux parler.
    Ok, mais comment la chaine est-elle transmise au buffer ?
    Il recopie la chaîne de caractères sur le flux.
    Caractére par caractére ? Désolé de vous embéter avec ça, c'est juste pour savoir comment est implémenté le transfert de la chaine... (ah, la curiosité ^^)

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Herode
    Les flots STL d'e/s sont bufferisés (via les streambuf internes), si c'est de ça que tu veux parler.
    SL, pas STL.

    Oui, il recopie caractère par caractère, il n'y a pas d'autres solutions, que je sache.

  13. #13
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Ok merci beaucoup.

    Dernière question :
    Dans ce cas, est-ce que ces deux codes sont identiques?
    string Ligne ("Test");
    cout << Ligne << '\n';
    et
    char TabLigne [] = "Test";
    for (unsigned i (0); i < 4; ++i)
    cout << TabLigne[i] << '\n';

  14. #14
    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 : 39
    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
    Du point de vue résultat peut-être, mais sinon rien à voir.

  15. #15
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Citation Envoyé par Tipoun
    string Ligne ("Test");
    cout << Ligne << '\n';

    char TabLigne [] = "Test";
    for (unsigned i (0); i < 4; ++i)
    cout << TabLigne[i] << '\n';

    Dans ce cas, est-ce que ces deux codes sont identiques?
    et
    Salut Tipoun,
    comme l'a dit Loulou 24 le résultat sera le même, par contre lorsque tu déclares :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      char TabLigne [] = "Test";
    En fait, TabLigne est un tableau de 5 caractères (on a \0) et Test est considéré comme une chaine de caractères constante, tu ne pourras donc pas la modifier. Tu pourras par contre changer l'adresse où pointe TabLigne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      char TabLigne[] = "Test";
      char Tab[10];
      TabLigne[1] = 'a'; // erreur
      TabLigne = Tab; // ok
    Bonne journée.

    b Oo
    b Oo

  16. #16
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Accessoirement, utiliser le marqueur de fin de ligne interne des flots est sans doute plus portable que de mettre "\n" en dur :

  17. #17
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Moi je parlais du point de vue de l'insertion finale de la chaine dans le buffer.

    Car si la string est injectée dans le buffer caractére par caractére, c'est quelque peu ressemblant avec un tableau de char non ?

    Accessoirement, utiliser le marqueur de fin de ligne interne des flots est sans doute plus portable que de mettre "\n"
    Merci je ne savais pas

  18. #18
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Oui, sur le principe, c'est la même chose. D'ailleurs...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<class _E, class _Tr, class _A> inline
        basic_ostream<_E, _Tr>& __cdecl operator<<(
            basic_ostream<_E, _Tr>& _O,
            const basic_string<_E, _Tr, _A>& _X)
        {
        _O << _X.c_str();
        return (_O); }
    Or, string::c_str() renvoie du char*...

  19. #19
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Ok merci beaucoup ^^

Discussions similaires

  1. probléme avec service WCF et les fichiers volumineux
    Par kikov dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 08/07/2014, 10h22
  2. Réponses: 2
    Dernier message: 14/10/2010, 11h38
  3. Problème avec l'unicode et les exceptions
    Par Rafy dans le forum C++
    Réponses: 5
    Dernier message: 07/02/2006, 00h52
  4. problème avec strtok pour récupérer les vides
    Par manikou dans le forum MFC
    Réponses: 4
    Dernier message: 02/06/2005, 20h08

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