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