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 :

[Win32] Problème lecture de fichier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    Par défaut [Win32] Problème lecture de fichier
    Bonjour,

    Petit problème pour lire une image png, Le code suivant marche bien quand je veux lire un bête fichier txt, mais pas une imag png, Dans mon buffer szBuf, je me retrouve qu'avec les 4 premiers octets du fichier, dans le fichier lu, le cinquième est un 00. Je pense que c'est lui qui fait bugger mon code.

    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
     
    fileHandle = CreateFile(ImagePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
     
    	if (fileHandle == INVALID_HANDLE_VALUE)
    	{
    		printf("Error CreateFile: %d\n", GetLastError());
    	}
     
    	DWORD dwFileSize = GetFileSize(fileHandle, NULL);
     
    	if (dwFileSize <= 0)
    	{
    		printf("Error filesize\n");
    	}
    	else
    	{
    		printf("Filesize: %d\n", dwFileSize);
     
    		char *szBuf = new char[dwFileSize + 1];
    		DWORD dwBytes = 0;
     
    		if (!ReadFile(fileHandle, szBuf, dwFileSize, &dwBytes, NULL))
    		{
    			printf("Readfile failed: %d\n", GetLastError());
    		}
    		else
    		{
    			printf("sizeof read: %d, nbtoread: %d\n", sizeof(szBuf) / sizeof(szBuf[0]), dwFileSize);
     
    			printf("file: %s\n", szBuf);
    			string filecontent = string(szBuf);
    			printf("filecontent %s\n", filecontent);
    Si vous avez une solution.

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Salut,

    pourquoi penses-tu avoir un pb ?
    Parce que printf("file: %s\n", szBuf); ou printf("filecontent %s\n", filecontent); affichent que qqs caractères uniquement ?
    Si oui, c'est normal, c'est un fichier binaire, donc des \0 y'en a un peu partout qui trainent. Vouloir afficher un fichier binaire dans la console, et comme du texte, c'est
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Attention, je ne vois rien dans ton code qui permette de s'assurer que szBuf[dwFileSize] est bien un caractère nul.
    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.

  4. #4
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    Par défaut
    @bouzk printé un binaire c'est WTF je suis d'accord, c'était juste un test pour "voir" combien de caractères chelou j'aurai. et forcément il s'arrête à 4. Le sizeof read me renvoit 4...
    @Médinoc Le cinquième est un null

    Comment je peux m'assurer que le fichier est complet dans szBuff? Dans le debugger de VC je ne peux pas voir le contenu de la variable. :\

    EDIT:

    J'ai trouvé d'ou venait mon problème... après avoir lu l'image je l'encode en base64

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    string Base64Encode(const char *s)
    {
    	DWORD dwSize = 0;
    	char szData[1024] = { 0 };
     
    	CryptBinaryToStringA((BYTE*)s, strlen(s), CRYPT_STRING_BASE64, nullptr, &dwSize);
    	if (dwSize < 1024) CryptBinaryToStringA((BYTE*)s, strlen(s), CRYPT_STRING_BASE64, szData, &dwSize);
     
    	return szData;
    }
    Et ca doit être dans cette fontion que ca déconne avec l'histoire du null byte.

  5. #5
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    Par défaut
    Je cerne mieux le problème, à la lecture, j'ia pas de problème, le fichier est bien complet, c'est juste que convertis le szBuff en string, donc forcement ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    datas = datas + "&s=" + string(szBuf);
    Une bonne solution serait de convertir szBuff en quelle type avant de l'avoir en string?

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Tout dépend ce que tu veux en faire derrière. Mais std::string ne peut pas contenir de \0. Si tu veux un conteneur qui contienne des \0, std::vector<char> peut être une solution.

    Dans tous les cas, la signature de ta méthode base64encode n’est pas adaptée :*elle prend un char const*, donc une chaîne terminée par un \0. Or, tu as des \0 au milieu de ta valeur, que tu souhaites encoder en base64 (ça ne pose pas de problème particulier). Il faut donc que tu lui rajoutes un paramètre taille et modifie le corps en conséquence.

    Sinon, la remarque de Médinoc est toujours valide : ta chaîne n’est pas terminée par un \0. Sois-en conscient quand tu la manipules (ça n’est pas forcément un problème, mais ça demande de l’attention, c’est vite fait d’appeler une fonction qui s’attend à ce que la chaîne soit terminée par un \0, et là, c’est le drame).

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Blo0d4x3 Voir le message
    Je cerne mieux le problème, à la lecture, j'ia pas de problème, le fichier est bien complet, c'est juste que convertis le szBuff en string, donc forcement ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    datas = datas + "&s=" + string(szBuf);
    Une bonne solution serait de convertir szBuff en quelle type avant de l'avoir en string?
    std::string peut tout à fait convenir, à condition d'utiliser le bon constructeur. C'est identique à l'utilisation d'un vector<char> en pratique.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. [NASM] Petits problèmes lecture de fichier
    Par Jaronimo dans le forum Assembleur
    Réponses: 1
    Dernier message: 01/05/2008, 14h56
  2. [XPATH] problème lecture dans fichier XML
    Par DiamonDonald dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 26/02/2008, 09h57
  3. Problème lecture gros fichier texte
    Par UnnamedBoy dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 22/02/2008, 11h13
  4. problème lecture seule fichier image
    Par Damien69 dans le forum Langage
    Réponses: 1
    Dernier message: 23/03/2007, 16h53
  5. problème lecture de fichier
    Par nico33410 dans le forum Langage
    Réponses: 2
    Dernier message: 29/10/2006, 20h01

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