Ouvrir un fichier

Résolu
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008
-
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008
-
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

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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().
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
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
<!--
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008

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
Messages postés
755
Date d'inscription
samedi 15 mai 2004
Statut
Membre
Dernière intervention
30 janvier 2011

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

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
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
HeapAlloc appelé avec GetProcessHeap() comme premier argument et le tour est joué, pas besoin de HeapCreate

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

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
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
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
<!--
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
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
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008

Oki, merci de toute ces conseils, je vais faire ce que tu as dis :p

Apprendre le VB6