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 :

[Filesystem] Problème de taille de contenu de fichier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut [Filesystem] Problème de taille de contenu de fichier
    Bonjour à tous,
    J'essaie de mettre le contenu d'un fichier de plusieurs MO dans un char* puis dans un string. Mais, le comportement de mon programme est bisare. Voici mon code :
    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
    string list_str;
    char* list_char;
     
    ifstream file("c:\\cpp\\copie\\out.txt",ios::binary);
    int size;
     
    // taille du fichier
    file.seekg(0,ios_base::end);	
    size= file.tellg();			
    file.seekg(0,ios_base::beg);  
     
    list_char= new char[size];			
    file.read(list_char,size);
    list_of_packets.assign(list_char,size);
     
    cout<<strlen(list_char)<<endl;       //cela m'affiche 2633
    cout<<list_of_packets.size()<<endl; // cela m'affiche 19599000 (qui est la taille exacte du fichier)
    cout<<list_of_packets<<endl;
    cout<<list_char;
    Pourquoi strlen(list_char) fournit-il une valeur différente de list_of_packets.size() alors que c'est justement list_char que j'ai mi dans list_of_packets ?

    Quand je vérifie le contenu, list_str contient bien le contenu exact du fichier, mais list_char ne contient qu'une petite partie, et arrête d'afficher lorsque, dans mon fichier , apparait le caractère NUL (identifié avec Notepad+).

    Est-cela le problème, comment rectifier et faire en sorte que char* contienne tous le contenu du fichier.

    Merci

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pourquoi strlen(list_char) fournit-il une valeur différente de list_of_packets.size() alors que c'est justement list_char que j'ai mi dans list_of_packets ?
    Parce que strlen s'arrête au premier 0. Donc ton tableau de caractères contient bien tous les caractères, c'est ta façon de les compter qui n'est pas adaptée.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Si tu es sous windows, c'est normal.
    Tous tes retours à la ligne sont sur deux bytes dans le fichier mais sont convertis en 1 byte en interne (toute l'utilité d'ouvrir un fichier en mode texte ).
    Si tu lis des données pures binaires, je te conseillerais d'ouvrir ton fichier en mode binaire puis de ne pas utiliser les méthodes de stream (les streams sont une surcouche aux buffers orientée chaines de caractères), utilises plutot les méthodes du buffer sous-jacent (la méthode rdbuf() de stream te renvoie un pointeur sur celui-ci). Finalement, n'utilises pas de std::string, ce n'est pas fait pour ça. Par contre un vector<char> fait des merveilles
    Si tu lis des données textuelles, laisses tomber ton pointeur de char. Utilises std::getline(stream&,string&) pour importer ton texte ligne par ligne puis concatène le tout dans un stringstream.

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut
    Merci Laurent pour l'explication et zais_ethael pour les pistes de solutions plus efficaces. Je vais me tourner vers cela

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut
    Je me permet de revenir car j'ai quelques soucis avec le morceau de code modifié suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      filebuf *pbuf;
      ifstream filestr;
      long size;
      char * buffer1;
     
      filestr.open ("c:\\cpp\\copie\\out.trp");
      pbuf=filestr.rdbuf();
      size=pbuf->pubseekoff (0,ios::end,ios::in);
      pbuf->pubseekpos (0,ios::in);
      buffer1=new char[size];
      pbuf->sgetn (buffer1,size);
      filestr.close();
      cout<<strlen(buffer1);
    A la fin lors de l'affichage de strlen(buffer1), la longueur affichée est de 4octets trop grande (dans mon cas : 19 599 004 octets alors que le fichier ouvert fait 19 599 000 octets).

    D'ou cela peut-il venir dans mon code ? Merci

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Je ne suis pas sur que ce soit ça, mais on dirait que tu n'as toujours pas ouvert ton stream en mode binaire.
    Voir ici: http://c.developpez.com/tutcpp/x6779.php#AEN6916, si je me souviens bien, il faut soit le passer en argument du constructeur de stream, soit à la méthode open().
    Edit: j'avais pas vu, oublie les strlen quand tu ne traites pas de chaines de caractères!!! D'ailleurs, tu n'ajoutes même pas de 0 à la fin de ton buffer, c'est le plantage aléatoire assuré ça !

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

Discussions similaires

  1. [ODBC] problème d'export du contenu de <textarea> vers un fichier csv
    Par maraly dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 27/04/2007, 09h14
  2. Réponses: 4
    Dernier message: 08/09/2006, 11h21
  3. Réponses: 1
    Dernier message: 26/04/2006, 12h01
  4. probléme d'affichage du contenu d'un fichier
    Par developppez dans le forum C
    Réponses: 2
    Dernier message: 20/04/2006, 19h16
  5. [langage] Problème de taille de fichier à mettre dans
    Par And_the_problem_is dans le forum Langage
    Réponses: 10
    Dernier message: 13/08/2002, 09h41

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