ReadFile

samki Messages postés 65 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 15 juillet 2004 - 22 juin 2004 à 16:45
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 - 23 juin 2004 à 17:30
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

hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
22 juin 2004 à 16:54
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);

0
samki Messages postés 65 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 15 juillet 2004
22 juin 2004 à 17:42
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
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
22 juin 2004 à 19:19
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 ?
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
22 juin 2004 à 22:17
il faut pas oublier de rajouter le nul de terminaison pour former une chaine C valide :
buffer[dwSize] = '\0';
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
22 juin 2004 à 22:23
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
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
23 juin 2004 à 00:01
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
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
23 juin 2004 à 09:42
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
0
samki Messages postés 65 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 15 juillet 2004
23 juin 2004 à 10:46
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
0
samki Messages postés 65 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 15 juillet 2004
23 juin 2004 à 11:08
j ai aussi essayé d'ajouer buffer[dwSize] = '\0'; mais ca marche pas
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
23 juin 2004 à 11:13
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
0
samki Messages postés 65 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 15 juillet 2004
23 juin 2004 à 11:30
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
0
samki Messages postés 65 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 15 juillet 2004
23 juin 2004 à 11:56
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
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
23 juin 2004 à 12:02
ca dépend, tu fais quoi comme modifications sur le contenu ?
0
samki Messages postés 65 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 15 juillet 2004
23 juin 2004 à 14:24
je remplace des chaines de caracteres par d autres
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
23 juin 2004 à 14:53
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
0
samki Messages postés 65 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 15 juillet 2004
23 juin 2004 à 15:09
ca sera lent,moi j utilise juste la fonction Replace()
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
23 juin 2004 à 15:35
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
0
samki Messages postés 65 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 15 juillet 2004
23 juin 2004 à 17:21
Replace je l'utilise avec une chaine de caracteres de type CString.
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
23 juin 2004 à 17:30
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
0
Rejoignez-nous