Bonjour,
Je voulais savoir si il y avait une difference de performance entre l'utilisation des CFile, OpenFile... Et l'utilisation de CreateFile, ReadFile... ou encore l'utilisation de fopen fread...
Merci.
Bonjour,
Je voulais savoir si il y avait une difference de performance entre l'utilisation des CFile, OpenFile... Et l'utilisation de CreateFile, ReadFile... ou encore l'utilisation de fopen fread...
Merci.
Eh bien, il me semble que toutes les fonctions, en interne, appellent CreateFile().
De plus, CreateFile marche uniquement en mode binaire. C'est pourquoi, pour lire des fichiers texte, il est fréquent d'utiliser fopen même si tout le reste du programme utilise l'API Windows.
CreateFile peut également ouvrir d'autres types ressources que des fichiers, certains ne pouvant pas être ouverts par les autres fonctions (un volume par exemple, me semble-t-il)
Edit: Woah, je viens de regarder dans les sources de CStdioFile, on trouve des tas de trucs intéressants mais non portables pour mapper entre CreateFile, open et fopen (cités ici du plus bas au plus haut niveau : CreateFile() -> _open_osfhandle (complètement non-standard) -> _fdopen (posix) )
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Exact. CreateFile c'est la fonction de base, qui t'offre le plus de "réglages" possibles. Mais elle est plus lourde à utiliser (forcément, rapport simplicité <-> possibilités). fopen est plus simple, portable, à priori plus lente, mais pas forcément. Car une bonne utilisation de fwrite (qui rajoute sa propre bufferisation) sera sûrement plus performante qu'une mauvaise utilisation de WriteFile. Mais bon à priori, utiliser directement les api système offre des performances difficiles à égaler pour une lib de + haut niveau.
salut,
je rajoute:
CFile utilise CreateFile ,WriteFile etc.. , et n'est pas bufferisé par rapport a fopen dont l'equivalent MFC est CStdioFile.
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
Question sans doute stupide, mais bon, j'ai l'habitude :![]()
fopen est la fonction d'ouverture de fichiers de base en C.
fopen est implémentée sous Windows en utilisant CreateFile.
Maintenant, comment est écrite l 'API, en C ???
Auquel cas comment est écrite CreateFile, en utilisant fopen ??
Au niveau système très profond, on utilise peut-être open, ou l'assembleur ?
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
salut
si tu cherches dans les sources de VC :
fopen appel CreateFile en passant par :
CreateFile est donc l'api de base ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 int __cdecl _tsopen ( const _TSCHAR *path, int oflag, int shflag, ... )
bon apres comment est ecrit CreateFile c'est une autre histoire.
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
open c'est POSIX il me semble. Sous Windows, ça utilise aussi CreateFile. CreateFile, c'est l'équivalent Windows du open de Linux (si open est bien l'appel système de bas niveau).
CreateFile, sous NT, utilise l'API native (NtCreateFile/ZwCreateFile) qui bascule en mode noyau et s'adresse au driver pour ouvrir le fichier.
En regardant dans la source de CStdioFile, on voit bien les différentes couches:
Déjà sous Unix, on avait fdopen() qui permettait d'ouvrir un FILE * sur un descripteur de fichier existant. (_fdopen() sous windows)
Sous Windows, on a en plus _open_osfhandle() qui permet d'ouvrir un descripteur de fichier sur un HANDLE existant
En fait, c'est comme si on programmait fopen comme ça (en simplifié, j'oublie les autres paramètres)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 FILE *fopen(const char *filename) { return _fdopen(_open_osfhandle(CreateFile(filename))); }
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Partager