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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair�
    Inscrit en
    Juillet 2006
    Messages
    747
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    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 �clair�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    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 �clair�
    Inscrit en
    Juillet 2006
    Messages
    747
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    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 �clair�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    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 �clair�
    Inscrit en
    Juillet 2006
    Messages
    747
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    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
    Membre �clair�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    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.

  7. #7
    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,
    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??

  8. #8
    Membre �clair�
    Inscrit en
    Juillet 2006
    Messages
    747
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    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

+ R�pondre � la discussion
Cette discussion est r�solue.

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