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

Langage Delphi Discussion :

comment ecrire dans un fichier txt avec WriteFile?


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut comment ecrire dans un fichier txt avec WriteFile?
    Bonjour,

    J'ai fait un CreateFile puis un WriteFile en ecrivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    filename := 'fichier.txt';
    h := CreateFile(PChar(filename),
        GENERIC_WRITE,
        0,
        nil,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        0);
     
    s := 'Le bonheur est dans le pre';
    WriteFile(h, s, Length(s)*sizeof(char), BytesWritten, nil);
    Or je ne retrouve qu'une suite illisible de caracteres dans mon fichier final: fichier.txt.. alors que je voudrais retrouver ma phrase 'Le bonheur est dans le pre' donc je ne comprend pas ! En fait j'utilise WriteFile parce qu'il me semble que c'est plus rapide que WriteLn non?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    j'ai trouve mon erreur c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WriteFile(h, s[1], Length(s)*sizeof(char), BytesWritten, nil);
    et non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WriteFile(h, s, Length(s)*sizeof(char), BytesWritten, nil);

    mais comment signaler un retour a la ligne?

  3. #3
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Citation Envoyé par Art19
    [..]J'utilise WriteFile parce qu'il me semble que c'est plus rapide que WriteLn non?
    Il vaut peut être mieux quelque chose de lisible et fiable, que de la bidouille spécifique soit disant optimisée !
    Donc, penche plutot pour le bon vieux WriteLn qui derrière en cuisine fera certainement mieux que toi (ou moi) l'apprentit cuisto avec les API windows.
    Et puis, c'est une bonne habitude à prendre que d'éviter les API spécifiques (à un OS, à une boite, ...), et seulement ensuit chercher à optimiser éventuellement, si cela est vraiment indispensable.

  4. #4
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Citation Envoyé par Art19
    mais comment signaler un retour a la ligne?
    Bin c'est selon l'OS: #13#10 (windows) ou bien #13 ou bien encore #10

    Laisse faire le WriteLn... il le prend en charge tes soucis...

    Fait attention, il te faut savoir que le type string en Delphi est un tableau de char qui commence à 1, car est stocké l'information sur la longueur à l'indice 0...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    ok mais bon je me suis fait engueule parce que j'utilisais WriteLn!

  6. #6
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Tu t'es fais enguelé par qui ?

    En tous cas, prend ce que je te dis juste comme un conseil pour pas se prendre la tête avec des problème que d'autre gars on pris en charge pour toi.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    mon boss!
    je me suis pas fait "engueule" mais bon il m'a fait comprendre que ya mieux que WriteLn..

  8. #8
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Peut-être qu'il y a mieux que le WriteLn, mais ç'est pour faire quoi ?
    Ecrire un fichier texte ?
    Loguer quelque chose ?

    Donne-nous des indices stp, sinon nos réponses seront aussi précises que tes questions

  9. #9
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Après, je peux te proposer la classe TFileStream qui te permettra de lire et/ou écrire de manière optimisé (car derrière ça utilise le stream windows) et c'est en meme temps parfaitement lisible (et portable).

    (Ecris TFileStream quelque part dans ton code, et fait F1 - ou bien cherche un peu sur le net)

  10. #10
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par Art19
    mon boss!
    je me suis pas fait "engueule" mais bon il m'a fait comprendre que ya mieux que WriteLn..
    hihi, ton boss, il ferait mieux de s'occuper de son boulot que de celui des programmeurs

    et si tu veux pas utiliser TextFile, faut pas pour autant taper dans l'API Windows, mais utiliser un TStringList.Load/SaveFromFile ou un TFileStream

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    oui c'est clair
    Ok merci pour le TFileStream

  12. #12
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 562
    Points
    3 562
    Par défaut
    Oui, et puis tu diras de ma part à ton boss qu'utiliser ce que WriteLn, ce n'est pas forcément plus mauvais que WriteFile... au contraire même, surtout le jour où vous décidez de porter le code sous Linux :
    WriteFile est une spécificité du langage Pascal (et Delphi), qui se retrouve sous les Pascal "Linux". Alors que WriteFile, coté portabilité, c'est plutôt limité.

    En plus question clarté de code, c'est un peu plus "propre" et maintenable.

    Enfin, quitte à utiliser les possibilités du Langage choisi pour développer, autant utiliser, comme le recommande sagement Paul Toth , TFileStream (pour les fichiers de tout poils), et TStringList (vraiment fait pour les fichiers textes).

    Franchement, "le pourquoi faire simple quand on peut faire compliqué" n'est pas une philosophie de développement à adopter.


    Cependant, une remarque ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WriteFile(h, s[1], Length(s)*sizeof(char), BytesWritten, nil);
    Sizeof(char) est égal à 1 (1 octet) donc totalement inutile...

    d'où, si ton boss y tient vraiment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WriteFile(h, s[1], Length(s), BytesWritten, nil);

  13. #13
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Oui, et on peut aussi faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WriteFile(h, PChar(s), Length(s), BytesWritten, nil);
    C'est plus propre.

    Je rejoins ce qu'a écrit waskol : WriteFile est en principe une fonction de l'API Windows. Mais je ne suis pas sûr à 100% qu'elle ne soit pas simulée dans Kylix.

    Quelqu'un peut essayer, peut-être ?

    Ah, et pour le SizeOf(Char)... hum. Et le jour où Delphi sera Unicode par défaut ? Non, c't'une blague...

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Tout est relatif!
    Si on ne quitte pas le monde windows, connaître WriteFile c'est aussi pouvoir l'utiliser en C++ par exemple.

    Ah, et pour le SizeOf(Char)... hum. Et le jour où Delphi sera Unicode par défaut ? Non, c't'une blague...

Discussions similaires

  1. [C#] Comment écrire dans un fichier Excel ?
    Par chorokari dans le forum C#
    Réponses: 8
    Dernier message: 09/02/2007, 10h17
  2. Comment ecrire dans un fichier en mise à jour
    Par Nkouka dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 17/10/2006, 21h08
  3. [VB.Net] Comment écrire dans un fichier texte ?
    Par Toto70 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 12/07/2006, 15h48
  4. [C#] Comment écrire dans un fichier Excel ?
    Par FoxDeltaSierra dans le forum ASP.NET
    Réponses: 2
    Dernier message: 07/05/2006, 16h29
  5. Ecrire dans un fichier txt sans en effacer le contenu
    Par cari dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 14/12/2005, 19h11

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