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 :

Initialisation et affichage d'un buffer.


Sujet :

C++

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Initialisation et affichage d'un buffer.
    Salut!

    J'implémente une classe fichier mais j'ai des problèmes pour afficher un fichier bufferisé:
    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
     
    class fichier{
    public:       string path;//adresse absolue du fichier
                  fstream file;
                  char *buffer;
                  int sizeofbuffer;
     
                  fichier(string s):path(s),file(NULL){}//constructeur
     
                  void open(){
                              file.open(path.c_str());
                              }
     
                  void bufferize(int n){
                                         buffer=new char;          
                                         file>>buffer;
                                         sizeofbuffer=n;                                      
                                         }
     
                  void printbuffer(){
                                     for(int i=0;i<sizeofbuffer;i++){
                                             cout<<buffer[i];
                                             }
                                     }
     
                              };
    Voilà le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(int argc, char *argv[])
    {
     
    fichier f("C:/a.txt");
    f.open();
     
    cout<<f.file.is_open()<<endl;
     
    f.bufferize(100);
    f.printbuffer();
    Ca compile,le test "f.file.is_open()" me renvoie 1 indiquant que le fichier est correctement ouvert,mais l'appel à la méthode "printbuffer()" m'affiche des signes qui n'ont rien à voir avec le fichier.

    Le problème est sûrement à l'initialisation de "buffer";j'ai essayé avec un "buffer" constant: sans faire d'allocation dynamique mais le problème demeure.

    Merci de votre aide.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  2. #2
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     void bufferize(int n){ 
                                         buffer=new char;          
                                         file>>buffer; 
                                         sizeofbuffer=n;                                      
                                         }
    :
    Ne serait-ce pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     void bufferize(int n){ 
                                         buffer=new char[ n ];          
                                         file>>buffer; 
                                         sizeofbuffer=n;                                      
                                         }

  3. #3
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut Re: Initialisation et affichage d'un buffer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                  void bufferize(int n){
                                         buffer=new char;          
                                         file>>buffer;
                                         sizeofbuffer=n;                                      
                                         }
    Déja ton new char alloue 1 seul octet de mémoire... Si tu veux allouer un tableau de 100 il faut ecrire :
    buffer = new char[n];

    Ensuite je trouve cette ligne bizard :
    file>>buffer;
    ca n'est pas la bonne méthode pour remplir un buffer selon moi

    Enfin pour finir :
    sizeofbuffer=n;
    Meme si dans l'absolue cela fonctionne, je pense qu'il existe des méthodes plus élégantes.
    J'aime pas les épinards... Mais alors pas du tout

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci de vos réponses mais le problème demeure.

    Cependant je croyais que "new char[n]" renvoyait "un pointeur sur un tableau de n caractere" alors que ici il renvoie "un pointeur sur un caractère":"char *buffer".
    De même que:
    est invalide mais:
    est bon;car "new int" renvoie "un pointeur sur un entier" et pas un entier.

    Quel est donc le fonctionnement de "new"?

    Merci.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    1 - je ne crois pas que fstream prenne NULL à la construction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      fichier( const string& s) : path(s)
      {} //constructeur
    devrait suffire.
    NB : passage d'objet par ref constante, plus économique que par copie

    2 - la ligne lit dans m_file jusqu'à tomber sur un séparateur (blanc, tabulation, saut de ligne, etc...).
    Si ton buffer fait 100 caractères, que le premier item fait moins de 100 caractères et que le buffer n'a pas été initialisé proprement, alors il peut se passer pas mal d'octets avant qu'on ne tombe sur un 0 terminal...

    3 - un new renvoie un pointeur sur le type demandé. Donc :
    new int renvoie un int*
    new char[10] un char* pointant au début d'une zone allouée pour 10 char
    new double[956] un double* pointant au début d'une zone allouée pour 956 doubles
    etc...

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci de ces conseils.

    J'ai fait des modifications mais il ne m'affiche que le premier caractère du fichier,les autres n'ayant rien à voir.

    Quelle est la bonne méthode pour copier un fichier dans un tableau ou un autre conteneur facilement manipulable?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  7. #7
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    en complement de ce que te dit Herode je te conseille d'utiliser la fonction

    file.read (buffer,n);

    Pour lire ton fichier... Cela peux eviter des erreurs de segmentation si la zone à lire est supérieur à la taille de ton buffer.
    J'aime pas les épinards... Mais alors pas du tout

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    En effet avec la méthode "read(...)" il affiche sans problème le contenu du fichier.

    En fait plus car le buffer est trop grand;d'ailleurs quelle est la méthode pour déterminer la taille du fichier?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  9. #9
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    L'opérateur >> fonctionne pour les fichiers texte ASCII. Si tu as un fichier binaire, il faut le lire en mode binaire (cf. Higestromm)

    NB : si tu as un fichier Unicode, UTF8 ou autre codage sur >1 octet... je ne sais plus, mais ça devrait se compliquer. Le sujet a été évoqué dans un fil il n'y a pas très longtemps, je crois.

    Quelle est la bonne méthode pour copier un fichier dans un tableau ou un autre conteneur facilement manipulable?
    Si tu veux le lire d'un coup, tu peux passer âr des bytearrays que tu tronçonnes et transtypes après à la volée. C'est rapide et remarquablement casse-gueule dès que la situation se complique
    Sinon, tu peux utiliser std::copy sur un std::vector par exemple. Ou faire toi même la boucle à la main.

  10. #10
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    L'opérateur >> fonctionne pour les fichiers texte ASCII.
    C'est un fichier texte notepad.
    C'est bien de l'ASCII?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  11. #11
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Oui. Ca devrait donc fonctionner.

  12. #12
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci à tous.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  13. #13
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par seriousme
    L'opérateur >> fonctionne pour les fichiers texte ASCII.
    C'est un fichier texte notepad.
    C'est bien de l'ASCII?
    Encodage 8bits, oui probablement. ASCII cela dépendra de ce que tu y mets. Au premiers caractère accentué tu sors de la table ASCII (limité à 127 caractères!), et dans mes souvenirs notepad a la facheuse habitude d'encoder en OEM (CP-850 sous nos tropiques). Cela serait compatible avec la console de windows, mais pas avec celles en iso-8859-1 (aka latin1) (/15 <-> latin 9).

    Bref, de toutes façons tu t'y prends mal. Cf ton autre topic où l'on te montre le chargement avec rdbuf() signalé dans la FAQ.

    PS: pour ce qui est d'utiliser >> pour lire des fichiers utf-8 ou autres, le problème est un chouilla plus complexe et peut demander des code convertion facets. boost.serialize et adobe.ASL (adam&eve) en fournissent, ou alors il y a des techniques plus manuelles, ou encore des lib à IHM.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/10/2013, 20h14
  2. Ordre affichage mauvais & Z-Buffer activé
    Par gladek dans le forum OpenGL
    Réponses: 11
    Dernier message: 04/10/2012, 17h06
  3. [VB.NET]Affichage d'un buffer SerialPort
    Par Yolak dans le forum Windows Forms
    Réponses: 28
    Dernier message: 10/07/2007, 11h25
  4. affichage dans le front buffers ne marche pas!
    Par jamal24 dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/08/2003, 19h14
  5. Affichage en passant par un buffer...
    Par Sirotilc dans le forum MFC
    Réponses: 5
    Dernier message: 27/05/2002, 21h00

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