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

Qt Discussion :

Lecture de fichier dans un constructeur


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 42
    Par défaut Lecture de fichier dans un constructeur
    Bonjour, Voilà un petit problème qui ne concerne pas directement qt, mais comme je suis en plein dans qt, sait-on jamais que le problème puisse également venir de là ^^. Je voulais savoir si l'on pouvait lire et transférer les données d'un fichier texte vers un tableau au départ d'un constructeur.

    J'ai en effet créé une boucle qui fonctionne dans un code test : J'ai un fichier texte comportant que des double hormis un séparateur "|" entre chaque série de donnée.

    Le fichier à lire:

    8.1 171 34.2 39.4 4.07 5.08 15.9 5.79 9.2 1.24 23.7 1.20 0.35 | 16.7 349.2 72.76 83.01 4.06 7.56 133.8 26.76 41.14 2.51 35.06 5.24 2.58 | 20.4 449.5 89.91 104.2 4.16 9.04 167.3 33.45 51.42 2.53 40.06 9.25 3.38 | 41.8 1143 190.4 235.8 4.63 18.04 399.2 75.31 116.3 2.74 66.06 68.21 9.93 |
    10.4 318 53.0 60.7 4.90 6.31 27.7 8.65 13.6 1.45 25.2 1.74 0.89 | 19.9 606.2 106.3 119.5 4.89 8.46 230.9 38.48 58.85 3.02 35.06 5.99 6.47 | 26.7 864.4 144.1 165.2 5.04 10.96 317.5 52.92 80.97 3.06 42.56 13.84 9.41 | 52.1 2018 288.2 350.6 5.51 21.15 702.8 111.6 171.6 3.25 68.56 91.66 24.79 |
    12.9 541 77.3 88.3 5.74 7.64 44.9 12.3 19.3 1.65 26.7 2.45 1.98 | 24.7 1033 155.4 173.5 5.73 10.12 389.3 55.62 84.85 3.52 36.56 8.13 15.06 | 33.7 1509 215.6 245.4 5.93 13.08 549.7 78.52 119.8 3.58 45.06 20.06 22.48 | 63.2 3291 411.4 493.8 6.39 24.46 1144 156.8 240.5 3.77 71.06 120.0 54.33 |
    15.8 869 109 124 6.58 9.66 68.3 16.7 26.1 1.84 30.3 3.60 3.96 | 30.4 1673 220.1 245.1 6.57 13.21 615.6 76.95 117.6 3.98 41.57 12.19 31.41 | 42.6 2492 311.5 354.0 6.78 17.59 889.2 111.2 170.0 4.05 51.57 31.24 47.94 | 76.2 5098 566.5 674.6 7.25 30.81 1759 211.9 325.5 4.26 77.57 162.4 108.1 |
    18.8 1317 146 166 7.42 11.3 101 22.2 34.6 2.05 31.8 4.79 7.43 | 35.5 2510 293.6 324.9 7.45 14.47 924.6 102.7 156.5 4.52 42.57 14.80 60.21 | 51.2 3831 425.7 481.4 7.66 20.24 1363 151.4 231.0 4.57 54.07 42.16 93.75 | 88.9 7483 748.3 883.4 8.13 34.65 2580 277.4 425.2 4.77 80.07 203.3 199.3 |
    22.4 1943 194 221 8.26 14.0 142 28.5 44.6 2.24 36.7 6.98 13.0 | 42.3 3692 388.6 429.5 8.28 18.08 1336 133.6 203.8 4.98 47.59 20.98 108.0 | 61.3 5696 569.6 642.5 8.54 24.83 2003 200.3 305.8 5.07 60.09 59.28 171.1 | 103 10640 967.4 1135 9.00 41.03 3651 354.5 543.2 5.27 86.09 259.4 346.3 |
    26.2 2772 252 285 9.11 15.9 205 37.3 58.1 2.48 38.4 9.07 22.7 | 50.5 5410 515.2 568.5 9.17 20.67 1955 177.7 270.6 5.51 50.09 28.46 193.3 | 71.5 8091 735.5 827.0 9.43 27.92 2843 258.5 393.9 5.59 62.59 76.57 295.4 | 117 14600 1217 1419 9.89 45.31 5012 443.5 678.6 5.79 88.59 315.3 572.7 |
    30.7 3892 324 367 9.97 19.1 284 47.3 73.9 2.69 43.4 12.9 37.4 | 60.3 7763 675.1 744.6 10.05 25.18 2769 230.7 351.7 6.00 56.10 41.55 328.5 | 83.2 11260 938.3 1053 10.31 33.23 3923 326.9 498.4 6.08 68.60 102.7 486.9 | 157 24290 1799 2117 11.03 60.07 8153 657.5 1006 6.39 106.6 627.9 1152 |
    0 0 0 0 0 0 0 0 0 0 0 0 0 | 68.2 10450 836.4 919.8 10.97 28.76 3668 282.1 430.2 6.50 60.62 52.37 516.4 | 93.0 14920 1148 1283 11.22 37.59 5135 395.0 602.2 6.58 73.12 123.8 753.7 | 172 31310 2159 2524 11.94 66.89 10450 779.7 1192 6.90 111.1 719.0 1728 |
    0 0 0 0 0 0 0 0 0 0 0 0 0 | 76.4 13670 1013 1112 11.86 31.74 4763 340.2 518.1 7.00 62.12 62.10 785.4 | 103 19270 1376 1534 12.11 41.09 6595 471.0 717.6 7.09 74.62 143.7 1130 | 189 39550 2551 2966 12.83 72.03 13160 914.1 1397 7.40 112.6 807.3 2520 |
    42.2 8356 557 628 12.5 25.7 604 80.5 125 3.35 46.1 20.1 126 | 88.3 18260 1260 1383 12.74 37.28 6310 420.6 641.2 7.49 68.13 85.17 1200 | 117 25170 1678 1869 12.99 47.43 8563 570.9 870.1 7.58 80.63 185.0 1688 | 238 59200 3482 4078 13.98 90.53 19400 1252 1913 8.00 130.6 1408 4386 |


    le fichier test qui fonctionne

    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
     
    #include <iostream>
    #include <fstream>
     
    using namespace std;
     
    int main()
    {
        double tabProfile[11][4][13];
      ifstream fichier("donnees/IpeHe.txt",ios::in)  ;
            if(fichier)
              {
              cerr << "donnée insérée"<< endl;
                 double IPE1, IPE2, IPE3, IPE4, IPE5, IPE6, IPE7, IPE8, IPE9, IPE10, IPE11, IPE12, IPE13;
                 string sepa;
                for (int h1(0);h1<=10;h1++)
                    {
                    for (int h2(0);h2<=3;h2++)
                        {
                            fichier >> IPE1 >> IPE2 >> IPE3 >> IPE4 >> IPE5 >> IPE6 >> IPE7 >> IPE8 >> IPE9 >> IPE10 >> IPE11 >> IPE12 >> IPE13 >> sepa;
                            tabProfile[h1][h2][0]= IPE1;
                            tabProfile[h1][h2][1]= IPE2;
                            tabProfile[h1][h2][2]= IPE3;
                            tabProfile[h1][h2][3]= IPE4;
                            tabProfile[h1][h2][4]= IPE5;
                            tabProfile[h1][h2][5]= IPE6;
                            tabProfile[h1][h2][6]= IPE7;
                            tabProfile[h1][h2][7]= IPE8;
                            tabProfile[h1][h2][8]= IPE9;
                            tabProfile[h1][h2][9]= IPE10;
                            tabProfile[h1][h2][10]= IPE11;
                            tabProfile[h1][h2][11]= IPE12;
                            tabProfile[h1][h2][12]= IPE13;
                            cout<<tabProfile[h1][h2][12];
                            cout<< "-";
     
     
                        }
                    }
                fichier.close();
     
                }
      else
        cerr << "Erreur à l'ouverture" << endl;
     
      return 0;
    }
    le constructeur qui bug:
    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
     
     
    #include <iostream>
    #include <fstream>
    #include <string>
     
    using namespace std;
    #include "Acier.h"
     
     
     
     
    Acier::Acier()
    {
        //  1- initiaisation du tableau des profilés
     
     
     
          ifstream fichier("donnees/IpeHe.txt",ios::in)  ;
          if(fichier)
              {
              cerr << "donnée insérée"<< endl;
                 double IPE1, IPE2, IPE3, IPE4, IPE5, IPE6, IPE7, IPE8, IPE9, IPE10, IPE11, IPE12, IPE13;
                 string sepa;
     
                for (int h1(0);h1<=10;h1++)
                    {
                    for (int h2(0);h2<=3;h2++)
                        {
                            fichier >> IPE1 >> IPE2 >> IPE3 >> IPE4 >> IPE5 >> IPE6 >> IPE7 >> IPE8 >> IPE9 >> IPE10 >> IPE11 >> IPE12 >> IPE13 >> sepa;
                            tabProfile[h1][h2][0]= IPE1;
                            tabProfile[h1][h2][1]= IPE2;
                            tabProfile[h1][h2][2]= IPE3;
                            tabProfile[h1][h2][3]= IPE4;
                            tabProfile[h1][h2][4]= IPE5;
                            tabProfile[h1][h2][5]= IPE6;
                            tabProfile[h1][h2][6]= IPE7;
                            tabProfile[h1][h2][7]= IPE8;
                            tabProfile[h1][h2][8]= IPE9;
                            tabProfile[h1][h2][9]= IPE10;
                            tabProfile[h1][h2][10]= IPE11;
                            tabProfile[h1][h2][11]= IPE12;
                            tabProfile[h1][h2][12]= IPE13;
     
     
                        }
                    }
                fichier.close();
     
                }
            else
                cerr << "Erreur à l'ouverture" << endl;
     
    }
    Le compilateur compile sans probleme mais quand je veux accéder aux données de tabProfile à l'aide d'un accesseur, soit ce dernier me met que ça vaut 0, soit qu'il n'y a rien, soit au contraire un chiffre à la rien à voir.
    exemple:
    tabProfile[0][0][0] donne:0
    tabProfile[1][2][1] donne:nan
    tabProfile[1][1][1] donne :00752677646597990214268129351581149300450528567736789343066212519888298601925118136264152243395706410518998590423351637660460312587536017111221628117725120824971544835631334404476113246316304828233085280602553539621390189261038286048639741874088338182161311989760.00

    Si quelqu'un a une idée ^^

  2. #2
    Membre expérimenté
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut
    Je pense que t'as un soucis avec le formatage automatique char* => double lors de ta lecture de fichier. Ton problème ne vient en tout cas pas de Qt (puisque tu n'en utilise pas dans le code que tu montres).

    L'utilisation d'un tableau à 3 dimensions est vraiment ce que tu souhaites ? Ne serait-il pas plus simple/compréhensible de passer par des struct ou des classes pour donner plus de sens à tes données ?

    J'ai pas la solution pour ton soucis, mais si tu travailles avec Qt, tu peux lire la totalité de ton fichier, placer son contenu dans une QString, découper tes "phrases" avec un QString::split("|"), parser tes phrases avec un foreach, découper tes "mots" avec un QString::split(" ") puis finalement caster tes mots en double avec QString::toDouble().

    Un exemple rapide pour te donner l'idée, pas compilé, pas testé. Y'a sans doute plus court en reprenant ce qui ne va pas dans ton code, mais comme je ne vois pas comme ça, je te propose une autre approche qui ne sera pas forcément la plus optimale pour ce que tu souhaites faire ^^

    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
    QFile fichier("donnees/IpeHe.txt");
    fichier.open(QFile::ReadOnly);
     
    QTextStream stream(&fichier);
     
    QString contenuFichier = stream.readAll();
     
    fichier.close(); //Appelé automatiquement en fin de portée, mais on l'appelle quand même pour plus de rigueur
     
    QStringList phrases = contenuFichier.split("|");
     
    foreach(const QString& phrase, phrases)
    {
        QList<double> data; //les données de la phrase
     
        QStringList mots = phrase.split(" ");
        foreach(const QString& mot, mots)
        {
             data << mot.toDouble(); //Valeur intéressante
        }
        //OU (pour parser)
        for (int i = 0; i < mots.count(); i++)
        {
             data << mots.at(i).toDouble(); //Valeur intéressante
        }
    }

Discussions similaires

  1. Problème de lecture de fichier dans un Jar
    Par hannibal.76 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 26/06/2012, 15h25
  2. Lecture de fichier dans jar
    Par fantomas261 dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 13/09/2010, 20h35
  3. lecture de fichier dans une servlet
    Par natoine dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2010, 23h21
  4. [T-SQL]Déplacement/copie/lecture de fichier dans un trigger?
    Par molarisapa dans le forum Développement
    Réponses: 3
    Dernier message: 06/12/2006, 14h08
  5. [MySQL] Lecture de fichiers dans un site
    Par rane dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 16/10/2006, 17h41

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