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 formatt�e dans un fichier binaire


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    162
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Par d�faut Lecture formatt�e dans un fichier binaire
    Bonjour,

    Je dois lire un fichier construit en concat�nant d'autres fichiers, genre une archive. Certains sont "binaires", genre un fichier png, d'autres "texte", genre un fichier texte. Je connais la position de chaque fichier, et le nombre d'octets qu'il occupe.

    J'aimerais pouvoir lire la partie texte du gros fichier, comme si il s'agissait d'un fichier texte ind�pendant.

    Pour cela, je fais un truc comme :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    std::stringstream str;
    std::ifstream f( "...", std::ios::binary ); /* l'archive */
     
    f.seekg( debut_du_texte, std::ios::beg );
     
    /*faire des f.read() et str.write() jusqu'à avoir lu tous les octets du texte dans le stringstream*/
    Ensuite j'utilise le stringstream comme si c'�tait un fichier ouvert en mode texte.

    Le probl�me est que, sous windows, je me retrouve avec des '\r' en fin de lignes. Je crois que comme le fichier d'archive est ouvert en binaire, les traitements sur le str; comme std::getline( line, str ), gardent les '\r'.

    Pour r�sumer : �a marche pas, et je capte pas pourquoi. Je m'attendais � ce que le stringstream, un flux en mode texte donc, d�gage les '\r'. Mais il ne le fait pas. Peut-�tre que normalement ce traitement est fait en amont ? genre dans les std::basic_streambuf et que mon code passe � cot� ?

    Voil� donc. Si vous avez des id�es � me donner, je vous serais reconnaissant.

    Merci

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    J'ignore s'il y a des trucs d�j� pr�ts pour �a, mais si tout le reste �choue, tu pourrais toujous te faire ton propre streambuf interm�diaire qui lit le stream binaire et supprime les \r...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre exp�riment�
    Profil pro
    Dev
    Inscrit en
    D�cembre 2007
    Messages
    191
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Dev

    Informations forums :
    Inscription : D�cembre 2007
    Messages : 191
    Par d�faut
    1) les caract�res de fin de ligne varient d'un syst�me � l'autre. Donc enregistrer des caractere de fin de ligne linux, fera qu'on vera des trucs bizarre en windows et invers�ment, � moins de pr�voir cela dans le programme

    2) les stringstream m'ont d�j� pos� ce genre de probl�me. Je me suis r�signer � lire mes fichiers texte ainsi pour pr�server tous les caract�res. (ainsi si un fichier est format windows, il le reste, etc....) :
    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 * lireTexte(const string & nomFichierTexte) {
    	ifstream fichier(nomFichierTexte.c_str(), ios::in | ios::ate);
     
    	size_t tailleFichier=fichier.tellg();
     
    	string * texte = new string("");
     
            texte->reserve(tailleFichier);
     
    	fichier.seekg(0); 
     
    	while (! fichier.eof() ) {
    		(*texte) += fichier.get();
    	}
     
    	fichier.close();
            return texte;
    }
    PS : bon y'a pas de v�rification d'erreur, c'est pas tr�s propre, mais la mani�re de faire marche tr�s bien.

  4. #4
    yan
    yan est d�connect�
    R�dacteur
    Avatar de yan
    Homme Profil pro
    Ing�nieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Ing�nieur expert
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par d�faut
    Bonjour,
    je ne sais pas trop si je vais dire une connerie mais bon
    ne peut tu pas ouvrir un ifstream en binaire et un istream en test et leur faire cohabiter leur buffer?

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    std::stringstream str;
    std::ifstream f( "...", std::ios::binary ); /* l'archive */
    std::istream fTxt;
    fTxt.rdbuf(f.rdbuf);
    http://www.cplusplus.com/reference/i...ios/rdbuf.html

    ouu charger toute la partie du fichier text et le mettre dans le streambuffer
    d'un istream (ou ifstream)

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    std::vector<char> textFile;
    std::istream fTxt;
    ...//bufferiser le fichier 
    ftxt.rdbuf()->pubsetbuf(&textFile[0],textFile.size());
    http://www.cplusplus.com/reference/i...pubsetbuf.html

    Voici un autre lien dans FAQ
    http://cpp.developpez.com/faq/cpp/?p...SL_redirection

  5. #5
    Membre confirm�
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    162
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Par d�faut
    Merci pour vos r�ponses,

    �crire un streambuf demande quand m�me un peu de boulot, et du coup je pr�f�re �crire ma fonction getline qui fait un std::getline puis supprime les '\r' � la fin de la ligne lue.

    Citation Envoy� par Mongaulois Voir le message
    Bonjour,
    je ne sais pas trop si je vais dire une connerie mais bon
    ne peut tu pas ouvrir un ifstream en binaire et un istream en test et leur faire cohabiter leur buffer?

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    std::stringstream str;
    std::ifstream f( "...", std::ios::binary ); /* l'archive */
    std::istream fTxt;
    fTxt.rdbuf(f.rdbuf);
    ...
    Je ne connaissais pas cette fa�on d'affecter un rdbuf. Malheureusement �a ne marche pas. Tout d'abord le constructeur de std::istream est prot�g� et je ne peux le construire ainsi. Ensuite, en bidouillant un peu avec l'autre partie que tu proposes, j'arrive � mettre le rdbuf de f dans un std::istringstream. Mais l� encore c'est un �chec.

    J'en suis � un code comme :

    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
      std::ifstream f(argv[1], std::ios::binary);
      char buffer[1000];
     
      f.read( buffer, 1000 );
      f.close();
      unsigned int n = f.gcount();
     
      std::istringstream iss;
      iss.rdbuf()->pubsetbuf( buffer, n );
     
      std::string line;
     
      while ( std::getline(iss, line) )
        std::cout << line << std::endl;
     
      iss.clear();
      iss.rdbuf()->pubsetbuf( buffer, n );
     
      while ( iss >> line )
        std::cout << line << std::endl;
    J'applique le code sur le fichier suivant :

    Citation Envoy� par le fichier
    ./out_text.exe\r\n
    a\r\n
    b\r\n
    c\r\n
    d\r\n
    La premi�re boucle while affiche les lignes avec des '\r' � la fin. Donc comme le std::endl ajoute aussi un \r\n, je me retrouve avec \r\r\n � la fin de chaque ligne. La deuxi�me boucle rend bien le r�sultat attendu, mais ne fonctionnerait pas si il y avait des espaces dans le fichier.

    Comme je l'ai dit plus haut, refaire une fonction getline r�sout le probl�me (et prend moins de temps que d'�crire ce post), mais si il y a un moyen de le faire avec l'existant, je pr�f�rerais.

    Merci

  6. #6
    yan
    yan est d�connect�
    R�dacteur
    Avatar de yan
    Homme Profil pro
    Ing�nieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Ing�nieur expert
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par d�faut
    j'ai essayer....
    C'est bizzare, j'ai le m�me probl�me que j'ouvre le fichier en txt ou en binaire(sous ubuntu)

Discussions similaires

  1. [D�butant] C# sous Win8, lecture dans un fichier binaire en asynchrone
    Par yupa dans le forum C#
    R�ponses: 2
    Dernier message: 14/06/2012, 14h35
  2. Lecture erron�e de float dans un fichier binaire
    Par Bourrine dans le forum Langage
    R�ponses: 10
    Dernier message: 23/05/2012, 09h12
  3. Lecture dans un fichier binaire
    Par crashtib dans le forum C
    R�ponses: 3
    Dernier message: 28/05/2009, 15h13
  4. Lecture ecriture dans un fichier binaire
    Par laetous dans le forum C
    R�ponses: 13
    Dernier message: 26/08/2006, 08h50
  5. ouverture/lecture/ecriture dans un fichier en mode binaire
    Par dirty_boy dans le forum D�buter
    R�ponses: 2
    Dernier message: 15/03/2006, 08h38

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