IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Difference entre CFile et CreateFile et fopen


Sujet :

MFC

  1. #1
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut Difference entre CFile et CreateFile et fopen
    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.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    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) )

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    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.

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    je rajoute:
    CFile utilise CreateFile ,WriteFile etc.. , et n'est pas bufferisé par rapport a fopen dont l'equivalent MFC est CStdioFile.


  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    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 ?

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut
    si tu cherches dans les sources de VC :
    fopen appel CreateFile en passant par :
    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,
            ...
            )
    CreateFile est donc l'api de base ...
    bon apres comment est ecrit CreateFile c'est une autre histoire.

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    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.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    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)));
    }

Discussions similaires

  1. Différences entre Delphi et Visual Basic ?
    Par Anonymous dans le forum Débats sur le développement - Le Best Of
    Réponses: 75
    Dernier message: 30/03/2009, 20h09
  2. La difference entre XSL et XSLT?
    Par pantin dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/06/2003, 15h14
  3. Difference entre fenetre et boite de dialog
    Par billyboy dans le forum Windows
    Réponses: 2
    Dernier message: 02/06/2003, 15h43
  4. [] Difference entre MSHFlexGrid et MSFlexGrid
    Par olivierx dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/04/2003, 08h48
  5. Difference entre types d'Adresse IP
    Par freud dans le forum Développement
    Réponses: 3
    Dernier message: 02/03/2003, 02h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo