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) )
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.
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 ?
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.
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))); }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager