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 :

Transformer du C en Qt


Sujet :

Qt

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut Transformer du C en Qt
    bonjour a tous,
    voila j'ai un problème, j'ai réussi a faire un programme qui fonctionne en c mais quand je le passe sous qt il me ferme le programme savez vous pourquoi ?
    merci
    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
     
            QString fileName = (ir.NomRonde+".bot");
            string name = fileName.toStdString();
            char** tab=(char**)malloc((10000)*sizeof(char*));
            char ** temp=tab;
            char* parcours=(char*)malloc((BUFSIZ)*sizeof(char));
            int j=0;
            FILE * fp=fopen("C:/WifiBot Controleur/Repertoire Ronde/"+name+".bot","r");
            if(fp==NULL)exit(1);
            while(fgets(parcours,BUFSIZ,fp)!=NULL)
            {
                temp[j]=(char*)malloc((strlen(parcours))*sizeof(char));
                strcpy(temp[j],parcours);
                j++;
            }
            int P = rt.P+6;
            int tableauB[8]= {0};
            int tableau1B[5]= {0};
            sscanf(tab[6],"P = %d,%d,%d,%d,%d,%d,%d,%d  //Date de modification = %d/%d/%d %d:%d\n",&tableauB[0], &tableauB[1], 
            &tableauB[2], &tableauB[3], &tableauB[4], &tableauB[5], 
            &tableauB[6],&tableauB[7],&tableau1B[0],&tableau1B[1],&tableau1B[2],&tableau1B[3],&tableau1B[4]);
            printf("%d,%d,%d,%d,%d,%d,%d,%d\n", tableauB[0], tableauB[1], tableauB[2],tableauB[3], tableauB[4], 
            tableauB[5],tableauB[6],tableauB[7]);
            sscanf(tab[P],"P = %d,%d,%d,%d,%d,%d,%d,%d  //Date de modification = %d/%d/%d %d:%d\n",&tableauB[0], &tableauB[1], 
            &tableauB[2], &tableauB[3], &tableauB[4], &tableauB[5], 
            &tableauB[6],&tableauB[7],&tableau1B[0],&tableau1B[1],&tableau1B[2],&tableau1B[3],&tableau1B[4]);
            printf("%d,%d,%d,%d,%d,%d,%d,%d\n", tableauB[0], tableauB[1], tableauB[2],tableauB[3], tableauB[4], 
            tableauB[5],tableauB[6],tableauB[7]);
            free(tab);
            free(parcours);

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Sûrement parce que le chemin de ton fichier n'est pas le bon. Tu as deux fois « .bot » :
    Une fois sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QString fileName = (ir.NomRonde+".bot");
    Et une seconde fois ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FILE * fp=fopen("C:/WifiBot Controleur/Repertoire Ronde/"+name+".bot","r");
    Tu l'aurais facilement vu si tu avais affiché un message d'erreur avant ton exit(1); brutal.

    Bon sinon, je te conseille fortement d'utiliser un std::vector de std::string (ou QVector de QString) à la place, d'autant que tu as une fuite de mémoire : tu oublies de libérer tous les temp[j].

  3. #3
    Invité
    Invité(e)
    Par défaut
    La concaténation "C:/WifiBot Controleur/Repertoire Ronde/"+name donne un std::string là où fopen attend un const char *.
    Il te faut appeler la fonction membre .c_str() sur ce retour.

    Sinon, la façon C++ de le faire : Comment faire pour lire un fichier ligne par ligne ?

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    désolé j'ai supprimer le message d'avant car j'ai compris le message d’erreur après que je tes répondu

    je vais checker ça merci

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    jai fait ce que tu ma dit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            QString fileName = (ir.NomRonde+".bot");
            string name = fileName.toStdString();
            const char* name2 = name.c_str();
    mais voila le problème il veux un const char, mais je n'arrive pas a passer un const char* en const char, connais tu un moyen pour y arriver ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    erreur : invalid operands of types 'const char [40]' and 'const char*' to binary 'operator+'
             FILE * fp=fopen("C:/WifiBot Controleur/Repertoire Ronde/"+name2,"r");
                                                                       ^

  6. #6
    Invité
    Invité(e)
    Par défaut
    C'est pas tout à fait ce que j'ai dit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QString fileName = ir.NomRonde + ".bot";
    std::string name = fileName.toStdString();
    std::string name2 = "C:/WifiBot Controleur/Repertoire Ronde/" + name; // c'est sur ce retour-ci qu'il faut appliquer .cstr(), pas avant
    FILE * fp=fopen(name2.c_str(), "r");
    Tu peux effectuer une concaténation avec + entre un std::string et " ... " ou deux std::string, mais pas entre deux " ... "/const char*.

    Tu peux aussi simplement effectuer les deux concaténations ensemble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QString fileName = "C:/WifiBot Controleur/Repertoire Ronde/" + ir.NomRonde + ".bot";

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    ah désolé javais mal compris

    après avoir fait ta premier solution, le programme s'exécute mais quand j'appelle la fonction, le programme crash avec le code d'erreur 255

  8. #8
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 431
    Points : 43 057
    Points
    43 057
    Par défaut
    Pourquoi ne pas utiliser un QFile pour gérer ton fichier ? Si tu passes sur Qt, autant utiliser les objets fournis. Cela t'évitera de convertir un QString en std_string pour le passer à ton *FILE.

    Regardes aussi du coté de QDebug, permettant d’afficher dans la console pas mal de contenu d'objet Qt.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    je n'utilise pas un QFile car je n'arrive pas récupéré ce qui n'intéresse dans un fichier, connait tu un moyen avec QFile ?

  10. #10

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    après avoir essayer avec QFile j'ai recrée un nouveaux programme:

    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
    QString NomRonde = "Parking";
        QString fileName = "C:/WifiBot Controleur/Repertoire Ronde/"+NomRonde+".bot";
        char** tab=(char**)malloc((10000)*sizeof(char*));
        char ** temp=tab;
        int j=0;
        int P=1;
        QFile fichier(fileName);
        fichier.open(QIODevice::ReadOnly | QIODevice::Text);
        QTextStream flux(&fichier);
     
        QString ligne;
        while(! flux.atEnd())
        {
            ligne = flux.readLine();
            const char *ligne2 = ligne.toStdString().c_str();
            char *ligne3 = strdup(ligne2);
            temp[j]=ligne3;
            j++;
            P++;
        }
        int tableauA[8]= {0};
        int tableau1A[5]= {0};
        sscanf(temp[6],"P = %d,%d,%d,%d,%d,%d,%d,%d  //Date de modification = %d/%d/%d %d:%d\n",&tableauA[0], &tableauA[1], &tableauA[2], &tableauA[3], &tableauA[4], &tableauA[5], &tableauA[6],&tableauA[7],&tableau1A[0],&tableau1A[1],&tableau1A[2],&tableau1A[3],&tableau1A[4]);
        printf("%d,%d,%d,%d,%d,%d,%d,%d\n", tableauA[0], tableauA[1], tableauA[2],tableauA[3], tableauA[4], tableauA[5],tableauA[6],tableauA[7]);
        sscanf(temp[P],"P = %d,%d,%d,%d,%d,%d,%d,%d  //Date de modification = %d/%d/%d %d:%d\n",&tableauA[0], &tableauA[1], &tableauA[2], &tableauA[3], &tableauA[4], &tableauA[5], &tableauA[6],&tableauA[7],&tableau1A[0],&tableau1A[1],&tableau1A[2],&tableau1A[3],&tableau1A[4]);
        printf("%d,%d,%d,%d,%d,%d,%d,%d\n", tableauA[0], tableauA[1], tableauA[2],tableauA[3], tableauA[4], tableauA[5],tableauA[6],tableauA[7]);
        free(temp);
    le programme s’exécute mais quand j'appelle la fonction il crash

  12. #12
    Invité
    Invité(e)
    Par défaut
    Parce que le std::string qui gère la durée de vie du pointeur que tu récupères est de suite détruit après ta ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char *ligne2 = ligne.toStdString().c_str();
    Cf. Comment convertir un QString en chaîne C (char *) ?
    Encore une fois, je te conseille de te débarrasser de tes char **/char * et d'utiliser un std::vector de std::string (ou leur version Qt : QVector/QString).
    Vérifier que l'ouverture du fichier a bien réussie ne ferait pas de mal non plus.

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    voila j'ai essayer avec un vecteur, je ne sais pas si c'est correcte ce que j'ai fait :
    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
    MainWindow::on_Rangement_clicked(){
        QString NomRonde = "Parking";
        QString fileName = "C:/WifiBot Controleur/Repertoire Ronde/"+NomRonde+".bot";
        QVector<QString> vector(0);
        int P=1;
        QFile fichier(fileName);
        if (!fichier.open(QIODevice::ReadOnly | QIODevice::Text))
            QMessageBox::critical(this, "Error", "la ronde "+NomRonde+" n'a pas pu etre ouvert");
        QTextStream flux(&fichier);
        QString ligne;
        while(! flux.atEnd())
            {
                ligne = flux.readLine();
                vector.append(ligne);//ecrire dans vector
                P++;//compter le nombre de ligne du fichier
            }
    }
    j'arrive pas a trouver un équivalent a sscanf pour récupéré les info

  14. #14
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Bonjour,

    Voici une solution qui fonctionne avec le format suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    P = 0,1,2,3,4,5,6,7  //Date de modification = 8,9,10,11,12,13
    P = 10,11,12,13,14,15,16,17  //Date de modification = 18,19,20,21,22,23
    P = 20,21,22,23,24,25,26,27  //Date de modification = 28,29,30,31,32,33
    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
    QString NomRonde = "Parking";
        QString fileName = "C:/WifiBot Controleur/Repertoire Ronde/"+NomRonde+".bot";
        QString s;
        QVector<QVector<int>> values;
        QStringList lines;
        QFile fichier(fileName);
        if (!fichier.open(QIODevice::ReadOnly | QIODevice::Text)) {
            QMessageBox::critical(this, "Error", "la ronde "+NomRonde+" n'a pas pu etre ouvert");
        }
        QTextStream flux(&fichier);
        QString ligne;
        while(! flux.atEnd())
        {
            ligne = flux.readLine();
            QTextStream ts(&ligne);
            // "P" "="
            ts >> s >> s;
            int v;
            char c;
            QVector<int> lineValues;
            for(int i = 0; i < 8; i++){
                //On récupère la valeur numérique
                ts >> v;
                lineValues << v;
                // ',' ou '/' pour la dernière itération
                ts >> c;
            }
            // "/date"  "de" "modification" "="
            ts >> s >> s >> s >> s;
            for(int i = 0; i < 6; i++){
                //On récupère la valeur numérique
                ts >> v;
                lineValues << v;
                // ',' ou '\0' pour la dernière itération
                ts >> c;
            }
            values << lineValues;
        }
    qDebug() << values;
    Le résultat est stocké dans un vecteur contenant un vecteur de int pour chaque ligne, un tableau 2D pour résumé,

    Voici le résultat (qDebug) du vecteur que j'obtiens avec les fichier de test donné plus haut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QVector(QVector(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), QVector(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23), QVector(20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33))
    Le problème avec cette solution utilisant QTextStream est que le format du fichier doit toujours être exactement le même, si l'on change quelque chose, on risque de cassé la compatibilité.
    Une autre solution pour le "décodage" de la ligne serait d'utiliser le QRegularExpression pour être un peu plus souple.

  15. #15
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    merci Gojir4 ton programme fonctionne parfaitement , j'ai juste une question comment on récupéré les valeur du vecteur ?

  16. #16
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Bonjour,

    Il y deux possibilités, avec la méthode at() (constant) ou l'opérateur [] (éditable):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int ligne0valeur0 = values.at(0).at(0);
    int ligne1valeur0 = values[1][0];
    int ligne2valeur1 = values.at(2)[1]
    Note que tu peux aussi tester la taille de ton vecteur avec size(), length() ou count()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int nbLignes = values.size();
    Je te conseille vivement une lecture de la doc de QVector

  17. #17
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonjour je vais regarder ça,
    j'avais pas vu que vous m'avez répondu,j'ai donc essaye avec un autre moyen et j'ai réussi a faire ce que je voulais

    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
        QString NomRonde = "Parking";
        QString fileName = "C:/WifiBot Controleur/Repertoire Ronde/"+NomRonde+".bot";
        QString s;
        int a = 0;
        int tab[100][13]={0};
        QFile fichier(fileName);
        if (!fichier.open(QIODevice::ReadOnly | QIODevice::Text)) {
            QMessageBox::critical(this, "Error", "la ronde "+NomRonde+" n'a pas pu etre ouvert");
        }
        QTextStream flux(&fichier);
        QString ligne;
        while(! flux.atEnd())
            {
                ligne = flux.readLine();
                QTextStream ts(&ligne);
                // "P" "="
                ts >> s >> s;
                int v;
                char c;
                for(int i = 0; i < 8; i++){
                    //On récupère la valeur numérique
                    ts >> v;
                    tab[a][i] = v;
                    // ',' ou '/' pour la dernière itération
                    ts >> c;
                }
                // "/date"  "de" "modification" "="
                ts >> s >> s >> s >> s;
                for(int i = 0; i < 5; i++){
                    //On récupère la valeur numérique
                    ts >> v;
                    // ',' ou '\0' pour la dernière itération
                    ts >> c;
                }
               a++;
            }
     
        int P=6;
        printf("%d,%d,%d,%d,%d,%d,%d,%d \n",
                   tab[P][0],tab[P][1],tab[P][2],tab[P][3],tab[P][4],tab[P][5],tab[P][6],tab[P][7]);
        int D=9;
        printf("%d,%d,%d,%d,%d,%d,%d,%d \n",
                   tab[D][0],tab[D][1],tab[D][2],tab[D][3],tab[D][4],tab[D][5],tab[D][6],tab[D][7]);

  18. #18
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    L'essentiel est que ça fonctionne.

    N'oubliez pas de mettre en résolu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PERL] transformation de fichier
    Par bob20000 dans le forum Langage
    Réponses: 6
    Dernier message: 27/07/2006, 11h13
  2. transformer un fichire Xml en pdf
    Par SuperFoustan dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 21/02/2003, 11h45
  3. transformer un jour en JJ/MM/AA
    Par gemini_010 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 08/11/2002, 22h55
  4. Transformer un caractère en type énuméré
    Par HT dans le forum Langage
    Réponses: 3
    Dernier message: 22/10/2002, 20h46
  5. FFT(Fast Fourier Transform)
    Par IngBen dans le forum Traitement du signal
    Réponses: 6
    Dernier message: 23/05/2002, 16h35

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