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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite

    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
    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".

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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 émérite

    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
    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...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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 confirmé
    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 : 39
    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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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.

+ 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