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 binaire


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut Lecture fichier binaire
    Bonjour a tous.

    Voila mon souci. Je dispose d'un fichier pdf dont je veux récupérer le flux. Un pdf étant un fichier binaire, je me retrouve avec une "chaîne de caractère" avec des "caractères" spéciaux...

    Ce flux pdf provient d'une base de données oracle (dans laquelle je l'avais mise sous forme de blob). J'ai vérifié, tout le flux est la en base : + de 86500 octets.

    Maintenant le souci est que dans ma dll c++, j'utilise la fonction read de l'objet OBlob pour récupérer le flux. Le hic, c'est qu'une partie du flux est récupérée. Lorsque j'ouvre le pdf pour en voir le code avec notepad++, je vois qu'au premier "caractère" NUL, il arrete de lire le flux.

    Or je ne vois vraiment pas comment faire (d'autant plus qu'il n'existe aucune documentation la dessus), pour faire en sorte que je puisse récupérer tout le flux et passer outre ce caractère "NUL" (surtout qu'il est la plus d'une fois).

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    La solution est de récupérer la taille de ton BLOB. Ensuite, tu boucles pour récupérer tous les n (1024 ou 4096 ou ...) octets dans un buffer et tu t'arrêtes lorsque tu atteins la taille de ton BLOB.
    Je ne me souviens pas avoir eu de problèmes en récupérant un BLOB d'une base, que ce soit avec ADO ou Sql Pro C. Peux-tu fournir le code source de ton pb ?

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Alors voici le code de ma fonction FromRecordSet :
    BLOB_SIZE est égal a 131 072

    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
    27
    28
    29
     
    CODE_RETOUR CFacturePayeur::FromRecordset(ServerGen::CRec* recObject){
     
    	OBlob result;
     
    	unsigned char *szBlobBuffer[BLOB_SIZE];
     
    	CODE_RETOUR iRetour = CODE_RETOUR_ERREUR_RECORDSET;	
     
    	if (recObject != NULL )
    	{
    		if (recObject->isEOF()== false )
    		{
    // je recupère ici les données issue de la base
    			m_IdFacture			= __int32(recObject->GetLong(CFACTURE_PAYEUR_ID_FACTURE));
    			m_IdClient			= __int32(recObject->GetLong(CFACTURE_PAYEUR_ID_CLIENT));
    			m_CrdSerial			= __int32(recObject->GetLong(CFACTURE_PAYEUR_CRD_SERIAL_CARTE));
    			result =			((ServerOra::CRecOra*)recObject)->GetBlob(CFACTURE_PAYEUR_BLOB);
     
    // c'est ici que j'utilise la fonction read
    			result.Read((unsigned char *)szBlobBuffer,BLOB_SIZE);
    			//m_Facture_Blob = CErgString(szBlobBuffer);
     
    		}
    		iRetour = CODE_RETOUR_REUSSI;
    	}
     
    	return iRetour;
    }
    et le code de ma fonction getBlob au cas où (mais je doute fort que le problème vienne de là)

    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
    OBlob ServerOra::CRecOra::GetBlob	(const TCHAR *tszName)
    {
    	OBlob			result;
    	oresult			res ;
     
    	try
    	{
     
    		res = m_PrivRs->GetFieldValue (tszName, &result) ;
    		if (res != OSUCCESS)
    			result = NULL ;
    	}
    	catch (...)
    	{
    	}
    	return result ;
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Le problème est que tu essaies de stocker le contenu de ton BLOB dans un unsigned char donc forcément au moindre \0 (NULL), tes méthodes prortant sur des char vont détecter une fin de chaine. Stocke plutôt ton BLOB dans un tableau de bytes.
    Il faut éviter aussi les :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *szBlobBuffer[BLOB_SIZE];
    cad les tailles fixes de flux de retour d'un BLOB. Car qui dit que ton BLOB ne dépassera pas ton BLOB_SIZE ? Mieux vaut boucler sur la taille de ton BLOB de retour et alimenter ton tableau de bytes au fur et à mesure

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Ok merci ep31, c'est vrai que tes reflexions sont très logiques mais n'étant pas très fort en C++, serait-il possible, si tu as ça sous la main que tu me files tes quelques lignes de code qui t'ont permis de récupérer le BLOB (ou alors l'algo que tu as énoncé tout à l'heure). Merci

    (Désolé mon truc c"est plus le web alors en c++, j'suis un peu perdu )

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Bonjour,
    Citation Envoyé par ep31 Voir le message
    Le problème est que tu essaies de stocker le contenu de ton BLOB dans un unsigned char donc forcément au moindre \0 (NULL), tes méthodes prortant sur des char vont détecter une fin de chaine. Stocke plutôt ton BLOB dans un tableau de bytes.
    Byte == unsigned char.
    Pour ton problème, C'est plustôt ta méthode pour traiter ton buffer qui est faux. Et non réellement le problème de '\0'.
    Que représente ton fichier??

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Désolé, je n'ai pas de code sous la main et cela fait un bout de temps que je n'ai pas touché au C++ mais en gros il faudrait une boucle while sur la lecture de ton BLOB (8192 octets par 8192 octets par exemple) et stocker ton résultat dans un tableau de byte que tu réalloues à chaque fois.

  8. #8
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Bonjour,


    Byte == unsigned char.
    Pour ton problème, C'est plustôt ta méthode pour traiter ton buffer qui est faux. Et non réellement le problème de '\0'.
    Que représente ton fichier??
    Mon fichier est un pdf

    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
    %PDF-1.3
    3 0 obj
    <</Type /Page
    /Parent 1 0 R
    /Resources 2 0 R
    /Contents 4 0 R>>
    endobj
    4 0 obj
    <</Filter /FlateDecode /Length 3294>>
    stream
    xœ¥ZÍrÛ8¾û)p™rRe#$ø?§•mfK)ÛòÊòÔN•/4)pQ¤Â'™Ó<Ò>RjOá>Åv¤ýÙbTqÉr4ݍ¯¿n‘O'u<òõäq˜C
    ƒà?—á7˦#žcRÇ&ñ‚|šä*#ÿ:¹˜MbÊñ“	'0Ý„?ŒµÏ|N`$cuMây.u2™’wWáÍàö*$ðs;zø#¼¾Éå`<	ÉènòçÍè=™<ƒLX”²üV)ÏÂoŒQ×'®oQßQJ±u¥ØAJÁ0EzÔ0×”ºÝÜ]‡ ËïD×cŸ Ó´¨rYôT%	/EJ¦~Q
    ¿ÏÉòsVfïŠÇ÷ðÇxxŸáOËŠ'y®ŠRÌDÁgÑ*Úì(8dC–‹öð‡ú–Tc”‹¹H£„ü 9/³*OyN²ŠLëeVÀ×$9
    ‹es2Lg-Ëï‹Ô
    È,ªž`ÂÔ/H”Æÿ+sø¸ÚExýq4žPr™-'KGNâDÀfÖæØ«h2ålƒQ‡A˜QßTž³Ö=g²Qî»Äµ-j»r§Ÿî'ÏÃË|Þ“ù4Þ^Ã_³c+Þp©çHñw¸Å§:*ÁAîL"GyÉ	F 8ÔV‘–ˆ§œ“(ŽÄ$ƒc2Ï£²¥´f™>˜ØS2ÁAq–$õüP^’ä{\ã×ß7ìÀ´ƒsgÇ
    h âúœ|ÒÂÍPÀŠQ.Êšðô ÃÒ
    u|ê(ß©õÏ9ÇД*Ó£ü†pá™»ýV‘´‘¼ž‚±ûØ™yÔò¥ÐeͲ4*áøë¶}[üb*%o2®š>°Í#ßÓE†‰ò¥v2±<˜2>ÉôTLá\‚‹z¸Ç %(y|§C“r¸ÈùáÚHôj*ìoÃö¾L*͏ïÏŽò¼í:-”´–ÕTDiIÇ
    ðþQ¶‹ºêœ*™czš=•hÞÁ¾=lF-[eT¹ujºÍÖ¯Tʁ؟žòÅ2ÉÄq{7!±0){ÊóÒS–ÃWUdp^
    /ûì”*"a™gÕú³Œ
    Ouvert avec notepad++. D'ailleurs même le copier / coller ne passe pas après le NUL

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Pardon,
    je voulais dire que représente ton buffer?? les fichier PDF en mémoire?

  10. #10
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Oui il s'agit du fichier pdf qui se trouve en base sous forme de blob, c'est cela que je voudrais mettre dans mon buffer

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par identifiant_bidon Voir le message
    Oui il s'agit du fichier pdf qui se trouve en base sous forme de blob, c'est cela que je voudrais mettre dans mon buffer
    Alors si je comprend bien,
    1- tu as un fichier PDF découpé en plusieurs BLOB.
    2- En suite tu veut reconstituer ton fichier en memoire
    3- tu veut lire le fichier PDF

    C'est bien cela?

  12. #12
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    J'ai un fichier pdf qui se trouve dans UN blob en base. J'aimerai finalement juste pouvoir le récupérer pour le lire ENTIEREMENT.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 498
    Points : 461
    Points
    461
    Par défaut
    Petite précision : tu travailles avec Visual C++?

  14. #14
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Je travaille sous Visual studio 2005

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 498
    Points : 461
    Points
    461
    Par défaut
    Je ne sais pas si ça peut être une piste pour toi mais j'ai trouvé ça:
    http://forums.microsoft.com/MSDN-FR/...5253&SiteID=12

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par identifiant_bidon Voir le message
    J'ai un fichier pdf qui se trouve dans UN blob en base. J'aimerai finalement juste pouvoir le récupérer pour le lire ENTIEREMENT.
    Je pense que tes méthodes ne savent pas lire ton PDF en memoire.
    Tu n'as donc juste qu'a l'écrire dans un fichier temporaire et de lire ce fichier.


    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int BufferSize = ...;//taille du fichier
    char * buffer = ...;//le fichier en memoire
    std::ofstream fout("c:/fichier_tmp.dpf",std::ofstream::binary);
    if(fout)
     {
    fout.write(buffer ,BufferSize );
    }
    else
    {
    //erreur d'ouverture du fichier
    }
    fout.close();

  17. #17
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Ok fucce merci, je vais regarder ça. Ca a l'air d'etre très interessant

    Mongaulois : j'aimerais bien ne pas passer par un fichier temporaire si possible mais je penserais a ta solution si je n'ai pas d'autres choix. Merci

  18. #18
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par identifiant_bidon Voir le message
    Ok fucce merci, je vais regarder ça. Ca a l'air d'etre très interessant

    Mongaulois : j'aimerais bien ne pas passer par un fichier temporaire si possible mais je penserais a ta solution si je n'ai pas d'autres choix. Merci
    Cela va dépendre des méthode de traitement d'un PDF que tu utilise.
    Si elle fonction par les flux, tu ne devrais pas trop avoir de problème.
    Dans un premier temps, écrit le fichier pour l'ouvrir avec un viewer et vérifier ce que tu récupère.

  19. #19
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Lorsque j'ouvre le fichier avec un viewer, j'obtiens une "chaine de caractères" dans lequel je retrouve mon NUL.

    Je vais essayer de fouiller mais ca fait un petit moment que je ne trouve pas et c'est pas loin de ma saouler.
    (D'autant qu'il est question pour bientot d'insérer en base également des images ...)

  20. #20
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Bon ben je réitère ma demande si jamais quelqu'un a une idée sur le sujet ...

    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 5 12345 DernièreDernière

Discussions similaires

  1. Lecture fichier binaire et inversion d'octets
    Par zoro_le_renard dans le forum Fortran
    Réponses: 8
    Dernier message: 17/07/2007, 20h35
  2. Lecture fichier binaire
    Par djidji dans le forum Langage
    Réponses: 1
    Dernier message: 09/11/2006, 11h58
  3. Réponses: 5
    Dernier message: 02/10/2006, 22h54
  4. Lecture fichier binaire
    Par kek_net dans le forum Langage
    Réponses: 5
    Dernier message: 07/08/2006, 19h37
  5. Lecture fichier binaire
    Par gabule dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/05/2006, 15h53

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