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

Windows Discussion :

[C] fopen()/fprintf() ==> CreateFile()/?


Sujet :

Windows

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut [C] fopen()/fprintf() ==> CreateFile()/?
    Bonjour,

    Imaginons que je veuille éviter les fonctions de MSVCRT.DLL, que je me fiche de la portabilité "Windows<->*nix" et que je veuille écrire un programme qui ouvre un fichier en écriture et écrive des "trucs" formatés dedans.
    Je peux ouvrir mon fichier avec CreateFile().
    Mais pour remplacer mon fprintf(), que puis-je utiliser ? FormatMessage() + WriteFile() ? Une fonction perso. ? Autre chose ?

    En gros et en plus court : que puis-je utiliser comme équivalent de fprintf() qui ne soit pas dans MSVCRT.DLL et qui fonctionne avec un HANDLE retourné par CreateFile() ? (et qui fonctionne de NT4 à 2k3 ou +)

    Cordialement,
    DS.

    PS : la question n'est PAS de savoir "pourquoi", la question est de savoir "quoi" ou "comment".
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ah, un sujet délicat.
    • Il n'y a pas d'équivalent direct à printf()/fprintf() en Win32. La classe MFC CStdioFile utilise les foncitions de la CRT (y compris celles qui permettent d'obtenir un descripteur, puis un FILE*, à partir d'un HANDLE).
    • Coté équivalent de sprintf(), c'est plus fourni.
      • Avec un SDK pas trop vieux, tu peux utiliser les fonctions de strsafe.h, mais elles utilisent la CRT.
      • Ou bien, tu peux essayer la fonction wsprintf() (ne te laisse pas méprendre par le "w", c'est une vraie fonction TCHAR), définie dans user32.dll. Par contre, il n'y a pas de limitation possible sur le nombre de caractères, à part cette mystérieuse "taille limite à 1024 octets" dont j'ignore le comportement si on cherche à trop écrire.
    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.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Merci pour ta promptitude (<- sans rapport avec une dame en Chine).

    Citation Envoyé par Médinoc
    Ah, un sujet délicat.
    C'est aussi pour ça que je viens ici

    Citation Envoyé par Médinoc
    Ou bien, tu peux essayer la fonction wsprintf() [...] Par contre, il n'y a pas de limitation possible sur le nombre de caractères.
    Côté limitation, il y en a apparemment une mais pas celle à laquelle tu fais référence :
    Citation Envoyé par [url]http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/resources/strings/stringreference/stringfunctions/wsprintf.asp?frame=true[/url]
    "The maximum size of the buffer is 1024 bytes."
    Pour l'autre ((manque de) limitation), je pensais déjà écrire une fonction qui calcule la taille de buffer nécessaire en fonction d'une chaîne de format et des arguments...mais si j'en suis là, autant écrire mon sprintf() avec allocation dynamique ("dsprintf()" ?)...j'hésite...
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le nom POSIX d'une telle fonction est asprintf().
    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.

  5. #5
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut Re:
    Tu utilises _stprintf() (déclaré dans tchar.h) qui est la version TCHAR de sprintf() puis après WriteFile(). Ou crée une fonction comme par exemple :

    #include <windows.h>
    #include <tchar.h>
    #include <stdarg.h>

    BOOL WriteFilef(HANDLE hFile, LPCVOID lpBuffer, DWORD dwNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped, ...)
    {
    va_arg args;
    va_start(args, lpOverlapped);

    TCHAR szString[255];
    _vstprintf(szString, lpBuffer, args);

    return WriteFile(hFile, szString, dwdwNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
    }

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le monsieur a dit sans utiliser la CRT...
    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.

  7. #7
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    On peut parfaitement utiliser printf cela fonctionne parfaitement ; dans le livre de Petzold l'auteur le reconnait lui-même.
    Mais il est préférable d'utiliser CreateFile.
    Sans runtime C c'est difficile ou alors c'est de la gestion de fichiers bas-niveau.
    Difficile de contourner les services de l'OS parce que c'est lui qui gère les fichiers ( fonction primaire d'un OS ) donc autant prendre CreateFile

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    CreateFile() n'est pas la CRT, c'est du Win32 : Ça répond donc aux critères de David.Schris.
    C'est printf() qui n'y répond pas.
    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.

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Bonsoir,

    @Médinoc vs ( Melem + Mat. M ) : heureusement qu'il y en a un qui suit !

    En tous cas, merci à tous (avec une mention spéciale à Médinoc).

    Je viens de retrouver un lien vers un article qui répond en partie à mes questionnements et est tout à fait dans le thème. On y lit, entre autres :
    Citation Envoyé par [url=http://support.microsoft.com/default.aspx?scid=kb;EN-US;q99456]Win32 Equivalents for C Run-Time Functions[/url]
    . Donc à moi les joies du réinventage de roue (ou du copiage de code en GPL ).

    Cordialement,
    DS.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par La même page
    sprintf wsprintf
    Donc, tu as toujours ça, mais il y a la limitation...

    Sinon, il me semble bien que la fonction CString::Format() de MFC réinvente également la même roue... (du moins pour le calcul de la taille).
    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.

  11. #11
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par Médinoc
    CreateFile() n'est pas la CRT, c'est du Win32 :
    oui je sais merci ; je n'ai pas dit que cela faisait partie de la CRT désolé si je me suis mal exprimé

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Médinoc
    [...] la fonction CString::Format() de MFC [...]
    Possible mais l'intitulé de mon post initial débutait par "[C]"...alors les MFC...
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. CreateFile ou fopen? chemin plusieurs dossiers
    Par James_ dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/08/2007, 18h33
  2. Port série avec fopen() ou createfile()
    Par zandoli dans le forum C
    Réponses: 4
    Dernier message: 11/10/2006, 09h22
  3. Difference entre CFile et CreateFile et fopen
    Par barthelv dans le forum MFC
    Réponses: 7
    Dernier message: 22/10/2005, 11h02
  4. CreateFile
    Par PEM dans le forum C++Builder
    Réponses: 2
    Dernier message: 31/07/2002, 15h33
  5. Réponses: 2
    Dernier message: 06/07/2002, 12h36

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