ReadFile

Signaler
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004
-
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
-
Bonjour,
j'aimerai lire un texte dans un fichier,je veux utiliser la fonction ReadFile mais j arrive pas.
Je veux que tt ce qui est lu soit affecter à une variable de type chaine de caractères.
voila mon code:
CString csDetection;
HANDLE hFileDetectTemplate = ::CreateFile(PathDetectTemplate,GENERIC_READ, 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if(hFileDetectTemplate != INVALID_HANDLE_VALUE && hFileDetectTemplate != NULL)
{
::ReadFile(hFileDetectTemplate,(LPTSTR)csDetection,strlen((LPCTSTR)csDetection),&dwWritten,NULL);

}
::CloseHandle(hFileDetectTemplate);
ca me fait une erreur au niveau du 2eme paramètres de la fonction ReadFile.
Aidez moi SVP

19 réponses

Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
le 3ieme paramètre correspond au nombre d'octet que tu veux lire, pas à la taille de la chaine, donc faut que tu récupperes la taille du fichier

regarde cet exemple
HANDLE hFile; 

hFile = CreateFile("test.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile == INVALID_HANDLE_VALUE)
return 1;
DWORD dwSize;
dwSize = GetFileSize (hFile, NULL);

if (dwSize == INVALID_FILE_SIZE)
return 1;
char *buffer = new char[dwSize+1];
DWORD bLu;
ReadFile(hFile,buffer,dwSize,&bLu,NULL);

Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

Merci bq pour ton aide,ca marche mais quand j affecte buffer à une chaine de caractère, je trouve des caractères ajouté dans la chaines.
voila mon code:

csHeader=buffer;
if(hFileDetection != INVALID_HANDLE_VALUE && hFileDetection != NULL)
{
::WriteFile(hFileDetection,(LPCTSTR)csHeader,strlen((LPCTSTR)csHeader),&dwWritten,NULL);

}
::CloseHandle(hFileDetection);
je comprends pas pq
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
tu n'es pas obligé d'utiliser buffer, tu peux mettre un CString au lieu d'un char*

sinon à quel endroit est-ce qu'il t'affiche des caractères bizarres ? dans le CString ? dans le fichier écrit (hFileDetection) ?

tu serais pas en UNICODE par hasard ?
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
il faut pas oublier de rajouter le nul de terminaison pour former une chaine C valide :
buffer[dwSize] = '\0';
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
il peut y en avoir des '\0' dans un fichier, c'est pas pour ca qu'on veut forcément s'arreter au premier '\0' ; mieux vaut à mon avis traiter la chaine en fonction de sa taille qu'on a obtenu avec GetFileSize
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
oui mais il me semble qu'il veut affecter le buffer lu dans un CString, il faut donc rajouter un nul à la fin pour terminer la chaîne car sinon on risque d'aller recopier des caractères non valides
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
ouais mais s'il fait une affectation et qu'il y a plusieurs \0 dans la phrase, il copiera jusqu'au premier, en oubliant la suite.
Mieux vaut je pense utiliser un memcpy avec la taille qu'on a obtenu avec GetFileSize
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

Il m'affiches des caractères bizarres dans le fichier écrit,alors j'ai fait ca:
HANDLE hFileTemplateDetect = ::CreateFile(PathTemplateDetect,GENERIC_READ, 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwSize;
dwSize = GetFileSize (hFileTemplateDetect, NULL);
char *buffer = new char[dwSize-4];
DWORD bLu;

if(hFileTemplateDetect != INVALID_HANDLE_VALUE && hFileTemplateDetect != NULL)
{
::ReadFile(hFileTemplateDetect,buffer,dwSize,&dwWritten,NULL);

}
::CloseHandle(hFileTemplateDetect);
ca marche mais quand j'ai essayé de faire une fonction avec ce code et de l'appeler pour des fichiers differents alors il me fait sortir une boite de dialogue avec "Mémoire insuffisante" c'est surement du à le "-4" que j'ai ajouté.mais autrement ca ne marche pas
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

j ai aussi essayé d'ajouer buffer[dwSize] = '\0'; mais ca marche pas
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
le new char DOIT etre de la taille dwSize+1
sinon, essaie d'écrire le nombre d'octet lu plutot que le strlen qui s'arrete au premier caractère de fin de ligne trouvé

c'est une recopie simple de fichier que tu veux faire ? si oui, il vaut mieux utiliser CopyFile
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

Non je copie un fichier modele et je change une partie de son contenu selon le coix fait via l inetrface et apres je l'enregiste dans un répertoire de sortie
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

Comment je pourrai ecrire le nombtre d octets,car les autres solutions je les ai tt essyer mais à chaque fois il me fait des trucs bizarre!ca va me rendre dingue
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
ca dépend, tu fais quoi comme modifications sur le contenu ?
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

je remplace des chaines de caracteres par d autres
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
ce que je ferais moi, c'est un pointeur qui se déplace le long de la chaine source, et je m'arreterai de recopier quand il serait égal au pointeur source + dwsize
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

ca sera lent,moi j utilise juste la fonction Replace()
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
a mon avis, replace il fait ca aussi...
au fait, t'es sur que ton CString il est bon ? il est pas tronqué au premier \0 trouvé ?

sinon, ce qu'il faut c'est determiner la taille du nouveau buffer à copier. Replace te renvoit le nombre d'instances remplacée. Reste à le multplier par la différence entre la longueur de la chaine source et la chaine destination et à l'ajouter à la taille totale pour obtenir la taille du nouveau buffer
Messages postés
65
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
15 juillet 2004

Replace je l'utilise avec une chaine de caracteres de type CString.
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
et ?

sinon, ce qu'il faut c'est determiner la taille du nouveau buffer à copier. Replace te renvoit le nombre d'instances remplacée. Reste à le multplier par la différence entre la longueur de la chaine source et la chaine destination et à l'ajouter à la taille totale pour obtenir la taille du nouveau buffer