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. #41
    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
    essaie
    if (result.IsNull()) std::cout<<"Le BLOB est NULL"<<std::endl;
    if (result.IsOpen') ) std::cout<<"Le BLOB est ouvert"<<std::endl;

    Utilise le try catch du C++, pour récupérer l'exeption et regarder ce quel represente

  2. #42
    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
    Quand je récupère mon result, je visualise ce qu'il contient avec visual et je vois que y a m_erri qui n'est pas égal à 0x00000000. Le problème c'est que je n'arrive pas a trouver a quoi l'erreur correspond 0x05572078.

    Je pense que mon prob doit venir du result que je ne récupère pas bien

  3. #43
    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
    Quand je récupère mon result, je visualise ce qu'il contient avec visual et je vois que y a m_erri qui n'est pas égal à 0x00000000. Le problème c'est que je n'arrive pas a trouver a quoi l'erreur correspond 0x05572078.

    Je pense que mon prob doit venir du result que je ne récupère pas bien
    as tu essayer ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (result.IsNull()) std::cout<<"Le BLOB est NULL"<<std::endl;
    if (result.IsOpen() ) std::cout<<"Le BLOB est ouvert"<<std::endl;

  4. #44
    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
    le BLOB est null et il est ouvert

  5. #45
    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
    le BLOB est null
    Voila pourquoi tu as une exeption. Ton Blob ne contiens rien, tu ne peut donc rien récupérer.
    C'est bizzare, avant tu montré un morceau du PDF, cela devait bien marcher? As tu changer des chose depuis???

    [EDIT]
    Ta base de donné n'as pas été modifié??

  6. #46
    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
    C'est ce que je viens de vérifier justement. La base de données n'est pas modifiée. Le blob est toujours là (je viens de le visualiser).

    Ce qui est bizarre c'est que en reprenant mon ancien code (celui de la première page), j'ai une erreur a ce niveau là :

    result.Read((unsigned char *)szBlobBuffer,BLOB_SIZE);

    Je récupérai bien une partie de pdf auparavant et maintenant, je récupère plus rien.

    Edit : j'ai 2 ou 3 petites etourderies ca et la que je suis en train de corriger

  7. #47
    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
    Dis monGaulois, dans le code que tu m'as filé, buffer tu le déclares en tant que quoi?


    Edit : Getsize est passé. Maintenant, il me demande le type de buffer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write(buffer, NbLue);

  8. #48
    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
    Dis monGaulois, dans le code que tu m'as filé, buffer tu le déclares en tant que quoi?


    Edit : Getsize est passé. Maintenant, il me demande le type de buffer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write(buffer, NbLue);
    Cool, tu arrive jusque la
    c'est un unsigned char, mais ofstream demande un char *.
    tu remplace par

    f.write((char*)buffer, NbLue);

  9. #49
    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 je viens de faire la modif que tu viens de me dire et à l'exécution, dès que je rentre dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write((char*)buffer, NbLue);
    j'ai l'erreur suivante :

    invalid null pointer

    Ca plante ici dans ostream
    _DEBUG_POINTER(_Str);

  10. #50
    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
    Alors je viens de faire la modif que tu viens de me dire et à l'exécution, dès que je rentre dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write((char*)buffer, NbLue);
    j'ai l'erreur suivante :

    invalid null pointer

    Ca plante ici dans ostream
    _DEBUG_POINTER(_Str);
    Peut tu mettre le code???

  11. #51
    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
    C'est bon j'ai mis bufferTmp et ca marche nickel je génère le bon pdf qui va bien.

    Maintenant au lieu de mettre write, il faudrait mettre le blob dans un tableau de byte je suppose ... Si tu pouvais m'aider monGaulois, ce serait sympa ... (enfin continuer a m'aider )

    Voici tout le code de ma fonction:

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    CODE_RETOUR CFacturePayeur::FromRecordset(ServerGen::CRec* recObject){
    	TraceLogMetier(LOG_NIVEAU_DEBUG,LC_DEB_LOG,"FromRecordset");
     
    	OBlob result;
    	unsigned char *buffer = 0;
    	unsigned char *szBlobBuffer[BLOB_SIZE];
     
    	CODE_RETOUR iRetour = CODE_RETOUR_ERREUR_RECORDSET;	
     
    	if (recObject != NULL )
    	{
    		if (recObject->isEOF()== false )
    		{
    			m_IdFacture			= __int32(recObject->GetLong(CFACTURE_PAYEUR_ID_FACTURE));
    			m_IdClient			= __int32(recObject->GetLong(CFACTURE_PAYEUR_ID_CLIENT));
    			m_Date				= CErgString(recObject->GetErgString(CFACTURE_PAYEUR_DATE_FACTURE));
    			m_MontantTTC		= __int32(recObject->GetLong(CFACTURE_PAYEUR_MONTANT_FACTURE));
    			m_Etat				= Etat_facture(__int32(recObject->GetLong(CFACTURE_PAYEUR_ID_FACTURE)));
    			m_CrdSerial			= __int32(recObject->GetLong(CFACTURE_PAYEUR_CRD_SERIAL_CARTE));
    			m_IdTypeCarte		= __int32(recObject->GetLong(CFACTURE_PAYEUR_ID_TYPE_CARTE));
    			try
    			{
    				result			= ((ServerOra::CRecOra*)recObject)->GetBlob(CFACTURE_PAYEUR_BLOB);
    			}
    			catch(std::exception e)
    			{
    			}
     
    			std::ofstream f;
    			f.open("c:/essai.pdf",std::ios::binary);
     
    			unsigned long size = result.GetSize();
     
    			// calcul de la taille du buffertemporaire optimale
    			unsigned long optchunk = result.GetOptimumChunkSize();
    			unsigned int bufsize = ((int)(32768/optchunk)) *optchunk;
     
    			if (bufsize > size) bufsize = size;
    			unsigned char *bufferTmp = new unsigned char[bufsize];
     
    			result.EnableStreaming(size);
     
    			short status= OLOB_NEED_DATA;
    			unsigned long NbLue=0;
     
    			while(status == OLOB_NEED_DATA)	 
    			{
    				NbLue= result.Read(&status, bufferTmp , bufsize);
    // C'est ici qu'il faudra que je créé un tableau de byte pour pouvoir sérialiser après je pense 
    				f.write((char*)bufferTmp, NbLue);
    			}
     
    			result.DisableStreaming();
     
    			delete [] bufferTmp ;
    			f.close();
    		}
    		iRetour = CODE_RETOUR_REUSSI;
    	}
     
    	TraceLogMetier(LOG_NIVEAU_DEBUG,LC_FIN_LOG,"FromRecordset");
    	return iRetour;
    }
    A la place du write, il faudrait déclarer un tableau de byte, je pense et boucler sur le tableau pour y insérer à chaque fois le bufferTmp mais n'étant pas du tout doué en c++, je ne connais pas la syntaxe pour faire ceci.

  12. #52
    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
    C bon j'ai mis bufferTmp et ca marche nickel je génère le bon pdf qui va bien.

    Maintenant au lieu de mettre write, il faudrait mettre le blob dans un tableau de byte je suppose ... Si tu pouvais m'aider monGaulois, ce serait sympa ... (enfin continuer a m'aider )


    soit (version, je me la pète un peu et pas spécialement facile a relire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //allocation du buffer du fichier;
    std::vector<unsigned char> monBufferDeFichier(size);
    int PositionFichier =0;
    while(status == OLOB_NEED_DATA)	 
    	{
    	PositionFichier += result.Read(&status, &monBufferDeFichier[PositionFichier ], (size-PositionFichier >bufsize) ? bufsize :size-PositionFichier  );
    	}
    ou, plus facile a lire
    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
     
    //allocation du buffer du fichier;
    std::vector<unsigned char> monBufferDeFichier(size);
    int PositionFichier =0;
    while(status == OLOB_NEED_DATA)	 
    	{
            //lecture du buffer
    	NbLue= result.Read(&status, BufferTmp,  bufsize );
            //copie dans le buffer de fichier. je te le faite sans utiliser les algos et sans verification des taille
           //Ici tu pourrai utiliser l'algo COPY
           for(int i=0;i<NbLue;++i) monBufferDeFichier[PositionFichier 
    +i]=BufferTmp[i];
     
           //mise a jour de la position du fichier
           PositionFichier +=NbLue;
    	}

    Au faite, j'ai cru lire dans la doc que read ne peut lire d'un coup que de petit fichier de moins de 512Ko. Aprés faut faire comme cela.

  13. #53
    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
    Super c'est axectement ce que je voulais mais tu crois qu'il serait possible de placer tout le resultat obtenu (le blob) dans un std::string pour pouvoir le sérialiser après et si oui, on fait comment ??

    Je sais que ma question est bête mais vraiment j'suis pas doué en c++.
    Après normalement, si la sérialisation passe cela sera nickel

  14. #54
    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
    Super c'est axectement ce que je voulais mais tu crois qu'il serait possible de placer tout le resultat obtenu (le blob) dans un std::string pour pouvoir le sérialiser après et si oui, on fait comment ??

    Je sais que ma question est bête mais vraiment j'suis pas doué en c++.
    Après normalement, si la sérialisation passe cela sera nickel
    une std::string pour du binaire c'est pas une bonne idée (toutjours a cause de NULL... ou autre caratère spéciaux en mode text).
    Sinon faut regarder le flux.
    QUel flux est utiliser pour la lecture du fichier??
    ifstream? iostream? ou autre??

  15. #55
    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
    une std::string pour du binaire c'est pas une bonne idée (toutjours a cause de NULL... ou autre caratère spéciaux en mode text).
    Sinon faut regarder le flux.
    QUel flux est utiliser pour la lecture du fichier??
    ifstream? iostream? ou autre??
    Je n'en ai pas la moinde idée malheureusement
    Pour la lecture du pdf, je verrai le code a employer en php

    Pour un std::string tout con, je sérialise et je passe le string au webservice qui le passe au php.

  16. #56
    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
    Je n'en ai pas la moinde idée malheureusement
    Pour la lecture du pdf, je verrai le code a employer en php
    Lol.
    Le flux est lu en PHP c'est ca??
    La je ne sait pas. Fait un nouveau poste pour demander comment convertir un fichier en mémoire vers un flux utilisé avec PHP.

  17. #57
    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 ben en tout cas, je te remercie beaucoup pour toute l'aide que tu as apporté. C'est super sympa.

    Franchement c vraiment la classe

  18. #58
    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
    Mais je pense que le plus simple est d'utiliser un fichier temporaire que PHP va relire.
    N'oublie pas de mettre résolue

  19. #59
    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
    Bonjour

    Mongaulois j'ai "dérésolu" le post car j'ai un souci avec le code (l'une ou l'autre façon que tu m'as donné dans ton post d'hier a 15h41 donne le même résultat)

    A l'exécution, j'ai un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector subscript out of range
    ce qui doit signifier un dépassement d'indice. Tu en penses quoi? et surtout comment faudrait-il résoudre le problème ?

    Merci

  20. #60
    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, a quel endroit?
    C'est possible que je me suis planté dans la taille du vector

+ 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