[C++] Exploiter une chaîne de caractère lue au clavier
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

[C++] Exploiter une chaîne de caractère lue au clavier



  1. #1
    invite9c9b9968

    Unhappy [C++] Exploiter une chaîne de caractère lue au clavier


    ------

    Bonjour à tous,

    Je me heurte à un problème que je n'arrive pas à résoudre. Voici le contexte : j'utilise Root, un logiciel C/C++ bien connu des physiciens HEP. Je voudrais lire un fichier de données et je souhaite laisser le choix du fichier. Donc je demande à l'utilisateur de taper le nom du fichier au clavier, je récupère la chaîne de caractères, et j'aimerais ensuite l'exploiter afin de lire dans le fichier de données correspondants. Et là, plantage

    J'ai tout essayé : avec string *file, string file, char * file etc... Rien à faire.

    J'ai vu que si je fais manger à bidule.open() un const char * il accepte. Le truc c'est que la chaîne n'est pas a priori fixée. J'ai donc pensé à passer par une étape intermédiaire, où je transforme ma string en une *char.

    Cependant, je ne sais pas comment lire la longueur d'une chaîne. J'ai essayé length(machaîne) et Root me renvoie "function length(machaîne) not defined".


    Je vous joins ici mon code, si vous pouviez m'aider ce serait cool

    #include "string.h"

    void Draw() {

    ifstream inStat;
    float x;
    float y;
    float z;
    int imax;
    string fileopen;
    char *intermediate;
    TH1F *stat = new TH1F("stat","Statistics on Slot 12 about Zline_s",100,20,30);
    TH1F *stat2 = new TH1F("stat2","Statistics on Slot 12 about Tshpr",30,0.012,0.015);
    TH1F *stat3 = new TH1F("stat3","Evolution of ",64,1,64);
    TH2F *ztshpr = new TH2F("ztshpr","",30,0.012,0.01 5,100,20,30);
    printf("Quel fichier ouvrir ?\n");
    //scanf(" %c",&fpen); pas bon, code C qui ne marche pas
    cin >> fileopen; // spécifique à C++
    cout << "le fichier est " << fileopen[0] << endl;
    imax= length() fileopen;
    for (int i= 0;i< imax;i++)
    {intermediate[i] = fileopen[i];}
    const char *feopen = intermediate;
    inStat.open(feopen);

    for(int i=1;i<65;i++) {
    inStat >> x;
    inStat >> y;
    inStat >> z;
    stat->Fill(x,1);
    stat2->Fill(y,1);
    stat3->SetBinContent(i,z);
    ztshpr->Fill(y,x);
    }
    ztshpr->Draw();
    inStat.close();
    }

    -----

  2. #2
    invite88ef51f0

    Re : [C++] Exploiter une chaîne de caractère lue au clavier

    Salut,
    Cependant, je ne sais pas comment lire la longueur d'une chaîne. J'ai essayé length(machaîne) et Root me renvoie "function length(machaîne) not defined".
    T'as essayé strlen(machaine) ?
    T'as quoi comme erreur ?

  3. #3
    erik

    Re : [C++] Exploiter une chaîne de caractère lue au clavier

    Salut,

    J'ai l'impression que tu déclare ta variable intermediate comme un pointeur de charactère mais que tu ne l'initialise jamais.
    En bon vieux c il faudrait placer un intermediate=malloc(la taille qui va bien) quelque part, en c++ y'a du new a utiliser.

    Alors forcément quand tu fais
    intermediate[i] = fileopen[i] , tu écrit un peu près n'importe ou en mémoire dans un espace que tu n'as pas réservé, résultat plantage

  4. #4
    invite9c9b9968

    Re : [C++] Exploiter une chaîne de caractère lue au clavier

    J'ai essayé ta suggestion Coincoin, et il change d'erreur pour me dire maintenant

    Error: strlen parameter mismatch param[0] C u Data.C:21:


    Sinon pour erik, ça plante avant même de lire la ligne d'allocation de intermediate, donc ça ne vient pas (pour l'instant en tout cas ) de là.

  5. A voir en vidéo sur Futura
  6. #5
    invite9c9b9968

    Re : [C++] Exploiter une chaîne de caractère lue au clavier

    En fait le plantage avec strlen vient du fait qu'il faut utiliser cette fonction exclusivement sur un type *char en C (or j'utilisais un type string de C++).

    J'ai remodifié légèrement le programme, et j'ai tenu compte de la remarque d'erik.

    Il ne plante plus, mais par contre il ne fait pas ce que je veux. Il ne lit pas le fichier..

    Citation Envoyé par Data.C
    #include "string.h"

    void Draw() {

    ifstream inStat;
    float x;
    float y;
    float z;
    char *a=malloc(256);
    TH1F *stat = new TH1F("stat","Statistics on Slot 12 about Zline_s",100,20,30);
    TH1F *stat2 = new TH1F("stat2","Statistics on Slot 12 about Tshpr",30,0.012,0.015);
    TH1F *stat3 = new TH1F("stat3","Evolution of ",64,1,64);
    TH2F *ztshpr = new TH2F("ztshpr","",30,0.012,0.01 5,100,20,30);
    printf("Quel fichier ouvrir ?\n");
    //scanf(" %c",&fpen); pas bon, code C qui ne marche pas
    cin >> a; // spécifique à C++
    const char *feopen = a;
    inStat.open(feopen);
    cout << feopen << endl;
    for(int i=1;i<65;i++) {
    inStat >> x;
    inStat >> y;
    inStat >> z;
    stat->Fill(x,1);
    stat2->Fill(y,1);
    stat3->SetBinContent(i,z);
    ztshpr->Fill(y,x);
    }
    ztshpr->Draw();
    inStat.close();
    }
    Par contre si à la place de const char *feopen= a je mets const char *feopen = "data12.txt" là il lit mon fichier

    No comprendo

  7. #6
    invite9c9b9968

    Re : [C++] Exploiter une chaîne de caractère lue au clavier

    Bon maintenant ça marche

    Merci à tous les deux

Discussions similaires

  1. chercher une chaine de caractère dans un texte en Langage C
    Par invitee5fedd72 dans le forum Programmation et langages, Algorithmique
    Réponses: 17
    Dernier message: 10/12/2010, 01h01
  2. [Divers] Remplacer une chaine hifi par un auto radio sur une renault 25gtx
    Par invitecad7596d dans le forum Dépannage
    Réponses: 0
    Dernier message: 28/10/2007, 17h25
  3. Fonction retournant une chaine de caractère
    Par inviteddae56c8 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 05/09/2007, 22h28
  4. [Brun] Enregistrer une chaîne sur une télé Waltham...
    Par invitef808e4fa dans le forum Dépannage
    Réponses: 0
    Dernier message: 22/08/2007, 15h52
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...