Ziman
Messages postés245Date d'inscriptiondimanche 27 avril 2003StatutMembreDernière intervention26 septembre 2008
-
24 août 2006 à 02:34
Ziman
Messages postés245Date d'inscriptiondimanche 27 avril 2003StatutMembreDernière intervention26 septembre 2008
-
25 août 2006 à 04:50
Bonjour (enfin bonsoir dans le cas présent),
j'apprend pour l'instant l'API WIN32 et j'ai décidé de faire un mini traitement de texte histoire d'apprendre un peu de tout. En fait, là j'ai réussi à afficher une boite de dalogue "ouvrir un fichier" tout seul :p (hum), et maintenant je me demandais comment mettre le contenu du fichier dans l'edit.
J'utilise pour l'instant un edit, j'essayerai après avec un richedit. Mais euh, j'ai pensé à une technique barbare qui consistait à récupérer la taille du fichier et lire par segment de 1024 caractères jsuqu'à la fin du fichier avec une gestion de la dernière chaine qui sera plus courte que 1024. C'est possible mais assez barbare.
Existe-t-il une solution "normale" ou est-ce que dans mon délire j'aurais trouvé la solution générale ?
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 24 août 2006 à 05:03
Salut,
Ziman >> Tu peux accepter plusieurs réponses.
A propos du chargement de ton fichier dans l'Edit, pourquoi le fragmenter? Tu peux le charger d'un seul coup. C'est plus rapide et efficace. Voici comment procéder:
- Ouvre ton fichier avec CreateFile().
- Obiens sa taille avec GetFileSize().
- Utilise HeapAlloc() pour créer un buffer de la taille du fichier + 1.
- Utilise ReadFile() pour remplir le buffer avec le contenu du fichier.
- Mets "\0" dans le dernier élément du buffer pour marquer la fin de la chaîne.
- Utilise SetWindowText() pour afficher le contenu du buffer dans ton Edit.
- Libère le HANDLE de ton fichier avec CloseHandle().
- Libère la mémoire allouée au buffer avec HeapFree().
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 24 août 2006 à 03:02
Tu utilise quoi? ReadFile? Dans ce cas, tu peux utiliser GetFileSize pour récupérer la taille du fichier. Si la taille est résonnable, tu peux faire un buffer de cette taille pour grâce à ReadFile, récupérer d'une seule fois tout le contenue du fichier et le placer dans le buffer puis ensuite le transférer dans ton edit. Sinon, si le fichier est trop gros, tu peux faire comme tu dit, par section. Cependant, pas besoin de faire de gestion de la dernière chaine plus courte. Le quatrième paramètre de la fonction retourne le nombre de caractère lue. Tu n'a qu'à prendre cette valeur pour copier le contenue d'un petit buffer.
Ziman
Messages postés245Date d'inscriptiondimanche 27 avril 2003StatutMembreDernière intervention26 septembre 2008 24 août 2006 à 03:06
Ah ui tiens, bonne solution. J'avais pensé pour le petite contenu. Je vais pour l'instant adopter ta solution, mais je ne vais pas tout de suite l'accepter juste pour voir si personne n'a une meilleure solution.
Ziman
Messages postés245Date d'inscriptiondimanche 27 avril 2003StatutMembreDernière intervention26 septembre 2008 24 août 2006 à 14:15
Je vois je vois. En fait je pensais le fragmenter car si celui-ci est très gros, ca va bouffer de la mémoire. Tout d'un coup quoi, si je fragmente par morceau de 1024, ca ne prendra qu'un Ko à chazque passage de boucle.
Ensuite, quelle est la différence entre HeapAlloc et malloc ?
racpp > J'ai fait exactement ce que tu m'as dit mais avec la fragmentation et ca marche niquel :p
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 24 août 2006 à 14:59
Bonjour,
Ce ne sont que des fichiers texte, donc je ne pense pas qu'ils soient très gros. La mémoire allouée avec HeapAlloc() sera aussiôt libérée avec HeapFree() une fois le fichier chargé.
Puisque tu veux travailler en API, tu devrais utiliser HeapAlloc() car cette dernière est justement une API. malloc() est une fonction du C standard.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 24 août 2006 à 15:07
SAKingdom> C'est la réponse de racpp qui a été acceptée parce que sa mise en page est meilleurs et qu'on plus envie de lire son message que le tien ;)
Autre chose: la taille du fichier peut être raisonnable, mais en aucun cas "résonnable"
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 24 août 2006 à 15:07
De plus, malloc te liera au CRT qui alourdira ton programme. Donc en effet, utilise HeapAlloc. Cependant, à moin que HeapAlloc fonctionne sans, tu devra créé la plage mémoire avec HeapCreate avant d'utiliser HeapAlloc et la supprimer avec HeapDestroy. Généralement, tu créé cette plage au début et la supprime à la fin du programme. Il existe aussi VirtualAlloc mais je crois que c'est pour de plus grosse somme de mémoire.
C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution
Forum de débats sur la programmation
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 24 août 2006 à 15:11
Ah ok.
Ouais je sais. Honte à moi. C'est à croire que le bouton Entrer ne fonctionne pas très bien. En effet, il y a plus de chance que la taille d'un fichier soit raisonnable qu'elle résonne.
C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution
Forum de débats sur la programmation
Ziman
Messages postés245Date d'inscriptiondimanche 27 avril 2003StatutMembreDernière intervention26 septembre 2008 24 août 2006 à 15:20
Oui, merci je viens de changer et ca fonctionne très bien.
Ensuite SAKingdom lol, ne te vexe pas. Le truc c'est que j'avais fait "l'algorithme" avant meme que racpp illustre ce que tu as dit avec une mise en forme. Je n'ai pas fais le code à partir de ce qu'il a dit mais à partir de ce que tu as dit et en voyant les fonctions qu'utilisaient racpp j'ai vu que j'avais fait pareil. Donc je lui ai dit que j'avais fait comme il l'avait dit lol.
Merci à tous pour vos réponses et vos précisions :p
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 24 août 2006 à 16:30
Je ne sais pas ce qu'en penserons mes amis vecchio et racpp mais moi, j'aurais créé un HANDLE en globale pour ensuite lui assigner avec GetProcessHeap une valeur dans l'apelle WM_CREATE ou WM_INITDIALOG (si c'est un dialog) de la procédure de ta fenêtre mère et c'est ce HANDLE que j'aurais passé en argument à HeapAlloc.
C'est plus rapide que d'apeller GetProcessHeap à chaque fois.
Vous allez me dire: "Quesque tu dit là toi! Ça changera pas grand choses."
C'est vrai mais je préfère prendre cette habitude.
De toute façon, vous serai probablement d'accord avec moi que d'apeller une fois une fonction est plus rapide que de l'apeller 50 fois :)
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 24 août 2006 à 16:38
Je fais comme ça aussi, faut pas appeler (eh oui, appeler prend deux p) GetProcessHeap à chaque fois
Bon allez j'arrête avec tes fautes, sinon j'ai pas fini :)
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 24 août 2006 à 16:47
Me*** c'est vrai. Je mèle tout moi. C'est pas drôle la vie :P Encore heureux que je n'écrive pas en SMS.
En passent, t'es pas obligé de ne corriger que mes fautes ;)
C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution
Forum de débats sur la programmation