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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 expérimenté
    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
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 expérimenté
    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
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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 expérimenté
    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
    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
    Membre averti
    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
    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

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

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

    Tu as fais #include <sstream> ?

    ++

  9. #9
    Membre expérimenté
    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
    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é ^^)

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