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 :

Problème lecture d'un fichier de 500 Ko


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Par défaut Problème lecture d'un fichier de 500 Ko
    Bonjour,
    Voilà un programme de notre laboratoire génère un fichier résultat (data.txt) que je souhaite parcourir en l'enregistrant dans un tableau de charactère (txt[]) afin de rechercher les données interessantes, je n'ai pas de soucie pour la recherche et pour l'écriture... En revanche, mon tableau qui doit posséder le fichier résultat n'est pas l'exact copie du fichier. En fait, mon tableau est de la bonne taille mais les données se répètent sans arrêt. Ces données (récupéré) sont d'ailleurs plutot celle de la fin du fichier résultat. Bref, voilà le début de mon code : (je précise que mon projet est un projet DOS, j'ai windows XP, j'utilise Borland C++).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    long unsigned int i=0, endTxt=SizeOfFileTexte();
    char *a,*txt;
    txt = new char[endTxt];
    FILE *p;
    p=fopen("data.txt","r");
    while(i<endTxt)
    {
    fread(a,sizeof(char),1,p);
    txt[i]=*a;
    i+=1;
    }
    fclose(p);
    La fonction SizeOfFileTexte() est vérifier mais comme elle apparait je mets son code aussi :
    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
    long unsigned int SizeOfFileTexte(void)
    {
    FILE *p;
    p=fopen("data.txt","r");
    char *a;
    long unsigned int e=0;
     
    while(fread(a,sizeof(char),1,p))
    	{
    	e+=1;
    	}
     
    fclose(p);
    return(e);
    }
    Je vous remercie par avance pour m'aider à correctement récupérer mon tableau car je n'y comprends plus rien. Il est a noter que ce fichier fait 500 Ko.

    Merci à vous,

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Ce code est plus du C que du C++. Si c'est du C que tu veux faire, dis le, on déplacera ton message vers le forum approprié. Si c'est du C++, je te conseille de lire l'entrée de la FAQ : http://cpp.developpez.com/faq/cpp/?p...RS_full_buffer
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Par défaut
    Oui c'est vrai que c'est assez proche du C bon il y a quand même new
    Merci pour ta réponse je vais utilisé l'exemple que tu m'as donné car c'est clair que c'est puissant le vrai C++. Je me rappelé plus les fonction I/O c++

  4. #4
    Invité
    Invité(e)
    Par défaut
    Si tu utilises des FILE, fopen, et fread, peut être devrais tu faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p=fopen("data.txt","rb");
    "r" ca ouvre en fichier texte... "rb" en binaire. En général, si tu utilised getline, gets, etc... tu veux un fichier texte, si tu utilises fread, fseek, tu veux un fichier binaire...

    Francois

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut Au sujet de l'intérêt des capacités propres du C++
    Salut,
    Citation Envoyé par Youry Voir le message
    Oui c'est vrai que c'est assez proche du C bon il y a quand même new
    Merci pour ta réponse je vais utilisé l'exemple que tu m'as donné car c'est clair que c'est puissant le vrai C++. Je me rappelé plus les fonction I/O c++
    l'opérateur new ne suffit pas à pouvoir décider que l'on code en C++, bien que ce soit un opérateur qui n'existe pas en C...

    Comme JolyLoic l'a signalé, il existe une entrée dans la FAQ pour charger l'ensemble d'un fichier dans un buffer, et je te conseille fortement de l'utiliser
    Citation Envoyé par fcharton Voir le message
    Si tu utilises des FILE, fopen, et fread, peut être devrais tu faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p=fopen("data.txt","rb");
    "r" ca ouvre en fichier texte... "rb" en binaire. En général, si tu utilised getline, gets, etc... tu veux un fichier texte, si tu utilises fread, fseek, tu veux un fichier binaire...

    Francois
    Mais, par pitié, sur le forum C++, la première chose à faire, c'est de veiller à donner des solutions C++...

    Cela signifie que dés que l'on remarque FILE, fread, fwrite, fopen, fclose ou même char* (plus toutes les choses auxquelles je ne pense pas), il faut tirer un signal d'alarme et bien faire comprendre à la personne qu'il travaille en C.

    Ceci dit, il y a une incohérence dans ce que tu nous écris:

    D'un coté, tu utilises un fichier dont l'extension est en *.txt, ce qui fait penser que tu utilise un fichier considéré comme étant un fichier contenant... du texte (des chaines de caractères, en fait), et de l'autre, tu ouvre ton fichier en mode "binaire", ce qui fait penser que tu souhaite gérer le contenu du fichier comme ... des données brutes...

    Dans le cas où tu veux gérer le contenu comme des données brutes, l'idéal serait sans doute d'utiliser un std::vector<char> (la classe vector est la classe que l'on conseille fortement d'utiliser de préférence à des tableaux "C style", disponible dans l'espace de nom std par simple inclusion du fichier d'en-tête <vector> car elle permet de travailler de manière bien plus simple et plus sécuritaire que ce que permettent les tableaux "C style" )

    Dans le cas où tu souhaites gérer le contenu du fichier comme des chaines de caractères, il semble raisonnable de penser que ce ne soit pas un ensemble de caractères qui t'intéresse, mais bien un ensemble de chaines de caractères (qu'un caractère seul ne suffise généralement pas pour faire ton travail)...

    L'idéal est donc, au choix:
    Soit de récupérer séparément l'ensemble des mots dans un tableau de chaines de caractères std::vector<std::string> (la classe std::string est la classe à utiliser pour les chaines de caractères, disponible dans l'espace de noms std par inclusion du fichier d'en-tête <string>)
    Soit de récupérer chaque ligne du fichier dans un tableau de chaines de caractères...

    Dans le premier cas, le code pour y arriver serait proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::vector<std::string> tab;
    std::string temp;
    std::ifstream ifs("fichier.txt");
    while(ifs>>temp)
        tab.push_back(temp);
    /*...*/
    et dans le deuxième cas, ce serait plutôt proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    std::vector<std::string> tab;
    std::string temp;
    std::ifstream ifs("fichier.txt");
    while(std::getline(ifs,temp))
        tab.push_back(temp);
    /*...
     * NOTA: il faudra sans doute un moyen de gérer le contenu de
     * chaque ligne lue ;)
     */
    Ce message a servi de base à débat portant sur la réalité des bonnes pratiques.

    Vous pourrez retrouver ce débats dans cette discussion
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Youry Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    long unsigned int i=0, endTxt=SizeOfFileTexte();
    char *a,*txt;
    txt = new char[endTxt];
    FILE *p;
    p=fopen("data.txt","r");
    while(i<endTxt)
    {
    fread(a,sizeof(char),1,p);
    txt[i]=*a;
    i+=1;
    }
    fclose(p);
    Egalement, dans cette fonction et l'autre, il faudrait probablement écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char a;
    fread(&a,sizeof(char),1,p);
    txt[i]=a;
    La raison est que quand tu déclares
    char *a;
    tu déclares un pointeur, mais pas la variable sur laquelle elle pointe, donc quand tu vas faire
    fread(a,1,1,p);
    tu vas mettre la données lue un peu n'importe où...

    char a;
    lui, définit une variable caractère, du coup
    fdat(&a,1,1,p);
    lui affecte le dernier caractère lu dans le fichier

    Chez moi (Borland C++ Builder 6, en mode console), ce dernier code fonctionne, le premier, non...

    Francois

  7. #7
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Par défaut
    Bonjour,

    Il est vrai que j'ai des connaissance parcellaire en C. Pour le c++ je sais simplement utiliser quelques méthodes classique (new, cout, cin...) et je sais créer mes classes, l'héritage... Mon intervention ici est simplement de faire fonctionner mon programme que j'ai effectivement écris manière C. Je charge les données brutes dans un tableau, et j'ai créer des fonction (qui fonctionne) pour recherché des mots dans le fichier, pour les lires, pour passer au mot suivant, à la lignes suivantes... J'imagine que ce genre de fonction existe avec un code C++ bien fabriqué et la classe qui convient, le truc c'est que chez moi j'ai pas le net, et même si c'est bourin et j'en conviens je voulais faire ce code vite fait et mon seul soucie c'est que je n'arrive pas à bien charger les fichier dans mon tableau.

    Pour la première réponse, j'étais très content de voir ce que ça donne (le code proposé par JolyLoic) mais bizarrement la bibliothèque <sstream> ne marche pas chez moi

    Ensuite je ne désespère pas grâce à cette remarque :
    Chez moi (Borland C++ Builder 6, en mode console), ce dernier code fonctionne, le premier, non...
    et je vais essayer comme fcharton me le propose, si je ne parviens toujours pas à mes fins, je reviendrais ici pour que vous m'aidiez à créer un vrai programme philosophie C++.

    Je reste curieux (pour me donner envie de refondre mon programme) pour savoir si il existe une class C++ permettant d'appeler des méthodes de recherche, de déplacement au prochains mots...

    Je vous remercie pour tous vos commentaires, et je laisse le soin au administrateur de déplacer ce post dans une rubrique plus appropriée si cela est nécessaire comme il le semble.

    Cordialement,

  8. #8
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Par défaut
    Bonjour,
    Rien y fait, avec la méthode de fcharton ou la mienne même bug, même combat.
    Maintenant que nous sommes sous C quelqu'un aurait il une solution à me proposer pour que dans mon tableau de char je récupère l'intégralité de mon fichier.

    Si j'affiche les caractères 1 par 1 pendant la lecture du fichier pas de soucie, le truc c'est qu'une fois fini la fenêtre DOS ne contient pas tout le fichier (c'est comme si la fenêtre DOS était plus petite que mon fichier).

    Bien que j'écrive les données au fur et à mesure il ne me reste à la fin dans mon tableau que la fin de mon fichier qui se répette n fois de tel sorte que la taille du tableau est égale à la taille du fichier.

    Bref, pouvez me fournir un petit bout de code écrit en C (car certain package C++ me manque) me permettant de construire ce fichu tableau contenant mes caractères ?
    Je vous remercie milles fois par avance,

    P.S : Même std::___ n'est pas reconnu , invalide namespace

  9. #9
    Invité
    Invité(e)
    Par défaut
    Reposte ton code complet dans le forum C...

    Francois

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Mais, comme j'ai essayé de te le faire comprendre (avant que l'on de dérive sur l'héritage du C++ par rapport au C), il faut, d'abord et avant tout, que ce soit en C ou en C++, savoir si ton fichier contient des données de type "texte" ou des données brutes.

    Si tu ouvre un fichier qui contient des données brutes en croyant manipuler un fichier qui contient en fait des données de type "texte" (comprend: uniquement des caractères dont la valeur dans la table ACII varie entre 32 et 127 (255 si tu utilise la table de caractères ASCII étendue) tu vas au devant de problèmes sans noms parce que tous les caractères de la table ASCII qui ont une valeur comprise enre 0 et 31 inclus ont en réalité une signification particulière:

    C'est en effet dans cette plage de valeurs qu'on retrouve les caractères que l'on représente sous la forme de '\0', '\n', '\t' et tous les autres, qui ont pour certain un comportement très surprenant quand on essaye de les afficher.

    C'est pour cela qu'il faut absolument, avant de pouvoir envisager de te donner une réponse claire et précise, savoir le type de données que tu manipule réellement avec ton fichier.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Par défaut
    Ok très bien je repost dans la rubrique C l'intégralité de mon projet + le fichier à lire.

    Merci à vous,

  12. #12
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 17

Discussions similaires

  1. [JDOM] Problème lecture d'un fichier XML avec JDOM
    Par Neo_007 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 22/06/2010, 09h46
  2. Problème: lecture dans un fichier
    Par doudou0088 dans le forum Débuter
    Réponses: 9
    Dernier message: 29/05/2008, 18h05
  3. problème : lecture dans un fichier
    Par sakura.haruno dans le forum Débuter
    Réponses: 5
    Dernier message: 22/12/2007, 10h41
  4. problème lecture d'un fichier texte
    Par karimspace dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/03/2007, 08h55
  5. Réponses: 12
    Dernier message: 14/06/2004, 13h06

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