Ouvrir un fichier

Résolu
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008 - 24 août 2006 à 02:34
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 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 ?

Apprendre le VB6

16 réponses

racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
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().
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
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.

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution
Forum de débats sur la programmation
<!--
0
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 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.

Merci de ton aide ...

Apprendre le VB6
0
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
24 août 2006 à 11:19
racpp repond toujours plus vite que moi ^^
tu a plusieurs cours pounvent t'interesser :

c.developpez.com/Cours/
regarde a API Windows
il y 2 cours (bob et CGI)

voila bonne chance
0

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

Posez votre question
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 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

Apprendre le VB6
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
24 août 2006 à 14:51
C'est drôle mais j'ai répondue la même chose que racpp quelques posts plus haut. C'est à croire qu'il ne lit pas les messages précédent ;)


malloc n'a pas vraiment de différence avec HeapAlloc car d'après mes souvenirs, sous Windows, malloc finis par utiliser HeapAlloc en bout de ligne.


C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution
Forum de débats sur la programmation
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
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.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
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"

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
24 août 2006 à 15:09
HeapAlloc appelé avec GetProcessHeap() comme premier argument et le tour est joué, pas besoin de HeapCreate

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
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
0
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 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

Apprendre le VB6
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
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 :)

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution
Forum de débats sur la programmation
<!--
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
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 :)

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
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
0
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008
25 août 2006 à 04:50
Oki, merci de toute ces conseils, je vais faire ce que tu as dis :p

Apprendre le VB6
0
Rejoignez-nous