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 :

lecture fichier & tableau(x) dynamic de chaine de caract


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut lecture fichier & tableau(x) dynamic de chaine de caract
    Bonjour,
    J'ai un peu plus d'experience en Fortran mais je dois modifier un programme écrit en C++ par quelqu'un d'autre afin de l'adapter à mes besoins présents. En ce moment le problème rencontré est la simple lecture d'un fichier contenant titres & nombre, les 2 étant utilisés ultérieurement dans le programme pour sélectionner des calculs. La version totale ressemble a:
    Part
    Caracteriz
    Elem 1
    nbT 3 // indique le nombre de lignes identiques qui suivent
    T1 200
    T2 300
    T3 400
    Step 200
    Labels 802 // indique le nombre de lignes identiques qui suivent
    946 a Si 0 -
    953 c Si 0 -a
    948 d Si 0 -a
    706 a C 3 -
    708 a C 4 a
    709 a N 4 bb
    710 a C 5 ba
    ...
    le nombre d'éléments à lire variant d'une fois sur l'autre mais la structure général du fichier reste la même à chaque fois... donc ce ne devrait pas être trop dur de tout lire mais en fait la lecture des chaines de caractères s'avère plus difficile que prévu... ou peut-être est ce la definition de mon tableau de caractères qui est foireuse mais je n'ai rien pu trouver qui puisse me débloquer... il y a beaucoup d'élément sur des tableaux de nombre mais pour les caractères je n'ai pu faire de connections... : (

    Je pars d'un truc du genre
    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
    int main(char **Descrip)
    { 
      FILE *fc;
      float number = new float [500];
      fc=fopen(fDetail,"r");
      fscanf(fc,"%s\n", Descrip[1]);
      fscanf(fc,"%s\n", Descrip[2]);
      printf("%s, %s \n", Descrip[1], Descrip[2]);
      ...
      fscanf(fc,"%s %d", Descrip[33], &number[25]);
      printf("%s %d \n", Descrip[33], number[25]);
    //...  
      fscanf(fc,"%s %d", Descrip[34], &number[26]);
      printf("%s %d \n", Descrip[34], number[26]);
    }
    Lecture et écriture vont bien jusque 33/25, puis 26 irait bien mais à 34 le contenu semble être “CXX0030: Error: expression cannot be evaluated” et quand j'essaie de l'imprimer à l'écran j'obtiens “Unhandled exception at … Access violation reading location…”. Le truc qui m'échape encore plus c'est que si je remplace 33 par 32 et 34 par 33 tout se passe bien... si ce n'est que j'ai plus d'une 100aine de Descrip[] à lire dans les fichiers... une fois 100, une autre fois 150... c'est peut-être un part importante de mon problème... : (

    J'ai aussi essayé un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     int main()
    { 
      FILE *fc;
      float number = new float [500];
      char **Descrip = new char*[600];
      fc=fopen(fDetail,"r");
      fscanf(fc,"%s\n", Descrip[1]);
    }
    ... mais là ça foire dès le début avec “access violation writing location…” et quand je regarde le contenu j'obtiens “CXX0030: Error: expression cannot be evaluated”... alors que si je rentre Descrip[1]="blabla" tout semble être OK, mais j'ai vraiment besoin de lire le contenu de ce fichier...

    J'ai essayé d'autres approches mais il est clair que je passe à coté de qq chose d'important et je ne sais pas vraiment quoi... et donc toute suggestion serait la bienvenue....

    Merci,
    PA

  2. #2
    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 : 40
    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
    Il n'y a dans ton code absolument rien de C++.

    Donc il va falloir soit déplacer ton post dans le forum C, soit changer complétement ton code (ce qui ne serait pas plus mal si tu codes bien en C++...).

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Indépendamment de la remarque (pertinente) de Loulou24 :
    code 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main(char **Descrip)
    ...
      fscanf(fc,"%s\n", Descrip[1]);
    les paramètres de main sont parfaitement définis (quand il y en a) , à partir des arguments de la ligne de commande qui a lancé le programme. Tu n'as pas le choix. Conséquence ???? (Pourvu que ca plante le plus vite possible). Le compilateur aurait du te signaler cette incompatibilité
    code 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     char **Descrip = new char*[600]; 
    ....
      fscanf(fc,"%s\n", Descrip[1]);
    Descrip est un tableau de 600 pointeurs sur char. Ces pointeurs ne pointent PAS vers un tableau de char comme le suppose le fscanf, puisque tu n'as jamais créé ces tableaux. Conséquence : plantage , pas de mémoire allouée pour les char lus dans le fichier

  4. #4
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    merci pour ces premiers commentaires.
    En fait qestion code, helas non je ne code pas bien en C++ ... je débute laborieusement... Quoiqu'il en soit, la personne qui avait écrit la première version du programme que j'essaie de modifier compilait avec MV C++... j'ai repris les mêmes élements et donc il n'est pas improbable qu'à la fois je ne sois pas sur le bon forum et qu'il me faille changer mon code... Les posts du forum de Visual C++ me semblaient très loin de mes soucis courants, mais vous avez une opinion bien plus aiguisée que la mienne pour savoir où mon message serait le mieux posté... C ou visual Cpp, toute suggestion sera approuvée d'office avec l'expression de toutes mes excuses pour cette erreur.
    En parallèle dans le premier commentaire de Diogène ("pourvu que cela plante au plus vite"), si j'ai un problème supplémentaire avec un compilateur qui ne signale pas les incompatibilités peut-être me faudrait-il aussi en changer... En auriez-vous un plus fiable à me conseiller ? Et merci pour le commentaire relatif au code 2, je vais voir ce que je peux faire...
    A+
    PA

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

Discussions similaires

  1. lecture fichier et tableau de BigInteger
    Par pipip dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 09/11/2009, 23h19
  2. lecture fichier et comparaison chaines de caracteres
    Par john123 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 08/05/2007, 11h38
  3. Lecture d'un tableau dans un fichier
    Par Sachiel31 dans le forum C++
    Réponses: 30
    Dernier message: 19/07/2006, 19h57
  4. C++ lecture d'un tableau dans un fichier
    Par nicoss dans le forum C++
    Réponses: 1
    Dernier message: 28/05/2006, 10h26
  5. Réponses: 4
    Dernier message: 12/10/2005, 21h22

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