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

Windows Discussion :

[WIN32]problème de Lecture d'un fichier texte


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut [WIN32]problème de Lecture d'un fichier texte
    Bonjour,
    J'essaye de lire dans un fichier texte. le fichier est lu mais à l'affichage du buffer je ne comprend pas ce qu'il se passe:
    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
    DWORD LoadBufferFromFile(LPCTSTR  datafilename, char ** buffer){
    	HANDLE hFile; 
    	DWORD dwSize;
    	DWORD bLu;
    
    	hFile = CreateFile(datafilename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    	dwSize = GetFileSize (hFile, NULL);
    	
    	*buffer = (char *) malloc(sizeof(char)* dwSize);	
    	ReadFile(hFile,*buffer,dwSize,&bLu,NULL);
    	if(bLu!=0){
    		printf("%u read from %s\n", bLu, datafilename);
    		printf("Loaded data:\n %s",buffer)
    	}else{
    		printf("Error reading %s",datafilename);
    		printf("Error code : %lu \n",GetLastError());
    	}
    
    	CloseHandle(hFile);
    	return dwSize;
    }
    ensuite lorsque je fait un printf("Loaded data:\n %s",buffer); je retrouve bien le contenu du fichier mais avec des caractères en plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //contenu du fichier "Hello Word!"
    11 read from d:\tmp\toto.txt
    Loaded data:
     hello word!²²²²½½½½½½½½■
    Est ce que quelqu'un peu m'expliquer ce qu'il se passe ???
    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    je vien de voire que j'ai aussi un problème à un autre endroit avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //move cursor to the begining of the section
    	filePtr = SetFilePointer(hFile, sectionOffset, NULL, FILE_BEGIN); 
    
    	//reading section data
    	char * instruction = (char *)malloc(sizeof(char)* sectionSize);
    	ReadFile(hFile,instruction,sectionSize,&bLu,NULL);
    	if(bLu==0){
    		printf("Couldn't read section\n");
    		printf("Error code : %lu \n",GetLastError());
    	}
    	printf("Section [%u bytes]:\n %s \n",bLu,instruction);
    qui me retourne la sortie suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Section data [1227 bytes]:
     @P
    Il y a bien 1227 octets a lire
    la aussi, je comprend pas tout...
    Merci encore

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    on est sur le forum C et ça n'est pas du C ...

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu as un problème de taille de buffer, il faut ajouter 1 caractère de plus que la longueur du fichier, pour y mettre le zéro terminal des chaînes. Comme celà tu n'auras pas ce problème de caractères en plus à l'affichage.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Citation Envoyé par souviron34
    on est sur le forum C et ça n'est pas du C ...
    Je ne vois pas en quoi.
    D'ici, ça ressemble plus à du C qu'à du C++.
    Par contre, j'admets que ce n'est pas du C standard, ça utilise l'API Windows.

    jesus144 : Au passage, ne caste pas le retour de malloc() : C'est inutile en C, et parfois nuisible.

  6. #6
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Médinoc
    jesus144 : Au passage, ne caste pas le retour de malloc() : C'est inutile en C, et parfois nuisible.
    Nuisible? Comment cela?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Peut cacher un oubli d'inclusion de <stdlib.h> si le compilateur n'est pas convenablement réglé.

  8. #8
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Médinoc
    Peut cacher un oubli d'inclusion de <stdlib.h> si le compilateur n'est pas convenablement réglé.
    Excusez-moi mais je ne vois toujours pas. Pourriez-vous être plus précis?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    Bonjour et merci de vos réponse.

    Si je viens d'augmenter de 1 la taille des buffers, ça ne change pas l'affichage. Est ce qu'il faut que je mette le dernier caractère à %00 à la main?

    Pour le deuxième affichage (la ou il n'affiche que le debut et pas la fin...) est ce que ça ne peut pas etre du a l'existance de %00 dans la chaine?

    Par contre si je ne caste pas le malloc, j'ai l'erreur suivante à la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error C2440: '=' : cannot convert from 'void *' to 'char *'
            Conversion from 'void*' to pointer to non-'void' requires an explicit cast
    J'utilise visual studio et donc cl comme compilateur...

    Merci de votre aide!!!

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    Est ce qu'il faut que je mette le dernier caractère à %00 à la main?
    effectivement, pour Hello Word!, il faut que je rajoute manuellement le dernier caractère à %00 et c'est bon... Mais c'est pas bizzard de le faire a la main ça, non???

  11. #11
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Vous utilisez des fonctions de l'API Windows pour lire le fichier texte. Or ces fonctions ne font pas la différence entre texte et binaire. Le '\0' n'est pas présent dans le fichier en lui-même et ce n'est pas ReadFile qui va le rajouter dans le buffer; cette fonction se contente de lire les octets du fichier.

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Citation Envoyé par jesus144
    Par contre si je ne caste pas le malloc, j'ai l'erreur suivante à la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error C2440: '=' : cannot convert from 'void *' to 'char *'
            Conversion from 'void*' to pointer to non-'void' requires an explicit cast
    Ça veut dire que tu compiles en C++ alors que ton programme est en C.
    Tu dois renommer ton fichier source en .c pour compiler correctement (ou bien, programmer en C++ et donc ne pas utiliser malloc()).

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Citation Envoyé par stephl
    Excusez-moi mais je ne vois toujours pas. Pourriez-vous être plus précis?
    Si <stdlib.h> n'est pas inclus, un compilateur C comme gcc ne fera pas d'erreur, tout au plus un warning et SEULEMENT S'IL EST ACTIVÉ (sachant que ce n'est pas activé par défaut).
    gcc croira donc à une déclaration implicite de malloc() et supposera une fonction retournant un int.
    Ainsi, on aura un warning "converting integer to pointer without a cast", SAUF si un petit malin a cru utile de caster le retour de malloc()...

  14. #14
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    OK, merci pour cette explication.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    Ca y est, je commence a y voire un peu plus clair... le problème est que je peux avoir des %00 dans mes chaines de caractères. Donc je ne dois pas employer %s comme format dans le printf. Il faudrai que je fasse un printf qui affiche en hexa par exemple les n premiers caratères de la chaine en les specifiant à la main en fonction du nombre de caractère lus...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de lecture d'un fichier texte
    Par peppena dans le forum Langage
    Réponses: 5
    Dernier message: 25/05/2007, 15h10
  2. Problème de lecture dans un fichier texte.
    Par Mike888 dans le forum C
    Réponses: 3
    Dernier message: 24/05/2007, 11h45
  3. problème de lecture depuis un fichier texte
    Par [Hugo] dans le forum C++
    Réponses: 12
    Dernier message: 27/10/2006, 16h46
  4. [VBnet] Problème de lecture d'un fichier texte.
    Par dibeloni dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/03/2006, 19h12
  5. Réponses: 2
    Dernier message: 28/12/2005, 15h00

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