PB avec WriteFile
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

PB avec WriteFile



  1. #1
    Ludwig1

    PB avec WriteFile


    ------

    Bonjour,
    j'utilise la fonction WriteFile
    https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

    Pour ajouter des lignes de texte dans un fichier.
    Si je crée le fichier avec CreatFile puis que j'enregistre les lignes les unes après les autres ça se passe bien.

    Si j'ouvre un fichier existant puis que je positionne le pointeur de fichier sur la fin de fichier avec
    SetEndOfFile, je n'arrive pas à rajouter la nouvelle ligne en fin de fichier, ça m'écrase toujours la première
    ligne du dit fichier.
    Je dois certainement oublier quelque chose, mais je ne vois pas quoi.
    Quelqu'un aurait 'il une idée.

    Cordialement

    Ludwig

    PS:

    Je programme directement avec les fonctions de Microsoft, de ce fait, les explications peuvent êtres données
    en C++

    Merci par avance

    -----

  2. #2
    Jack
    Modérateur

    Re : PB avec WriteFile

    Y a-t-il un intérêt à faire de la programmation bas niveau pour programmer des fichiers texte plutôt que d'utiliser les fonctions de la bibliothèque standard qui sont portables, bufferisées, etc.?

  3. #3
    Ludwig1

    Re : PB avec WriteFile

    Citation Envoyé par Jack Voir le message
    Y a-t-il un intérêt à faire de la programmation bas niveau pour programmer des fichiers texte plutôt que d'utiliser les fonctions de la bibliothèque standard qui sont portables, bufferisées, etc.?
    Salut,
    Oui, à commencer par les temps d'exécution, mais ceci n'est qu'un aspect de l'affaire.
    Le standard bufferisé fait également appel aux fonctions de MS
    Une autre raison est la création sur mesure.

    Donc si tu vois ou j'ai oublié quelque chose, merci de me le dire.
    Cordialement

    Ludwig

  4. #4
    pm42

    Re : PB avec WriteFile

    J'ai peut être raté qque chose :

    SetEndOfFile function: Sets the physical file size for the specified file to the current position of the file pointer.

    Ce qui n'a pas grand chose à voir avec mettre le pointeur à la fin pour étendre non ?

    C'est plutôt le FILE_APPEND_DATA dans le CreateFile qui ferait ce que tu veux.

  5. A voir en vidéo sur Futura
  6. #5
    Ludwig1

    Re : PB avec WriteFile

    Citation Envoyé par pm42 Voir le message
    J'ai peut être raté qque chose :

    SetEndOfFile function: Sets the physical file size for the specified file to the current position of the file pointer.

    Ce qui n'a pas grand chose à voir avec mettre le pointeur à la fin pour étendre non ?

    C'est plutôt le FILE_APPEND_DATA dans le CreateFile qui ferait ce que tu veux.

    Salut,

    Voici ce que dit encore Microsoft
    The SetEndOfFile function can be used to truncate or extend a file.
    FILE_APPEND_DATA Est une constante de configuration, j'ai déjà essayé. j'ai probablement une erreur quelque part.

    Cordialement
    Ludwig

  7. #6
    Ludwig1

    Re : PB avec WriteFile

    Citation Envoyé par pm42 Voir le message
    J'ai peut être raté qque chose :

    SetEndOfFile function: Sets the physical file size for the specified file to the current position of the file pointer.

    Ce qui n'a pas grand chose à voir avec mettre le pointeur à la fin pour étendre non ?

    C'est plutôt le FILE_APPEND_DATA dans le CreateFile qui ferait ce que tu veux.

    Re,

    Merci d'avoir répondu, entre temps j'ai trouvé, j'ai bêtement oublié de déplacer le pointeur en fin de fichier avant d'enregistrer les données.
    Fonction SetFilePointer

    Cordialement

    Ludwig

  8. #7
    Bluedeep

    Re : PB avec WriteFile

    Citation Envoyé par Jack Voir le message
    Y a-t-il un intérêt à faire de la programmation bas niveau pour programmer des fichiers texte plutôt que d'utiliser les fonctions de la bibliothèque standard qui sont portables, bufferisées, etc.?
    Aucun, sauf très grosses contrainte de perf sur de très petites quantités de données, mais dans ce cas on utilise les appels asynchrones des fonctions en question et pas le C++.

    Dans le cas contraire, c'est absurde : le temps passé en IO étant en moyenne de deux ordres de grandeurs (ou plus) plus grand que lui de l'overlap d'appel lié à l'encapsulation.

    Bref, du "cargo cult programming" .....
    Dernière modification par Bluedeep ; 16/09/2016 à 08h57.

  9. #8
    Ludwig1

    Re : PB avec WriteFile

    Citation Envoyé par Bluedeep Voir le message
    Aucun, sauf très grosses contrainte de perf sur de très petites quantités de données, mais dans ce cas on utilise les appels asynchrones des fonctions en question et pas le C++.

    Dans le cas contraire, c'est absurde : le temps passé en IO étant en moyenne de deux ordres de grandeurs (ou plus) plus grand que lui de l'overlap d'appel lié à l'encapsulation.

    Bref, du "cargo cult programming" .....
    Salut,
    J'ai pas dis que j'utilise C++, j'ai dit que les explications peuvent êtres données en C++ nuance. Tu sais très bien avec quoi je travaille.
    J'ai déjà donné quelques exemples.

    Code:
    see close-file
    40793F   40649F ( CloseHandle ) CALL    E85BEBFFFF
    407944   EBX NEG                                 F7DB
    407946   EBX EBX SBC                          19DB
    407948   EBX NOT                                 F7D3
    40794A   4 # EBP SUB                           83ED04
    40794D   EBX 0 [EBP] MOV                    895D00
    407950   -C5 # EBX MOV                       BB3BFFFFFF
    407955   0 [EBP] EBX AND                     235D00
    407958   4 # EBP ADD                           83C504
    40795B   RET                                        C3
    Un CALL sur une fonction de Microsoft, quelques lignes de code pour arranger les bidons et le tour est joué.
    Toi tu tous faire mieux.
    Comme moi qui ne suis qu'un tous petit programmeur, ce que j'arrive à faire me convient parfaitement bien.

    Tu vois, quand j'ai besoin d'une procédure spécifique, je me la taille sur mesure, c'est l'avantage d'une architecture ouverte.

    Cordialement

    Ludwig

  10. #9
    Ludwig1

    Re : PB avec WriteFile

    Les # Citations Envoyées par pm42 Voir les # messages
    Salut,
    Comme tu sais, C++ est normalisé ANSI et ISO, en lisant les "remarques" que tu fais en permanence au sujet des outils que j'utilise, je suppose que tu connais ces outils à la perfection.

    Je montre ici une syntaxe C++ proposée par Microsoft j'ai pris la fonction MessageBox, j'aurai aussi pu prendre
    SetEndOfFile.

    A coté je montre la syntaxe dans l'outil que j'utilise.



    Code:
    \ 2.1.2.1)	Syntaxes
    
    C++ ----------------------------------  Forth 	     
    Int WINAPI MessageBox (		       \ Evolution de la pile de données			
    _In_opt_ HWND    hWnd,	  	       HWND	      (   --- hwnd    )		
    _In_opt_ LPCTSTR lpText,               lpText	      (   hwnd --- hwnd, adr1,   ) 
    _In_opt_ LPCTSTR lpCaption,            lpCaption      (   hwnd,adr1, --- hwnd,adr1,adr2,   )   
    _In_     UINT    uType	   	       uType	  (  hwnd,adr1,adr2,-hwnd,adr1,adr2,MS_cnts ) 	
    );			               MessageBox
    
    Prototype:	MessageBox	(  hwnd,adr1,adr2,MS_cnts, ---  MS_cnt  )
    Etant ignorant et débutant comme tu le dis si souvent, pourrais tu m'expliquer ce que tu considères comme étant à côté de la plaque dans le cas de l'outil que j'utilise.
    Je précise que les deux outils ci-dessus mentionnés sont normalisés ISO et ANSI.
    Le fait est que ce que ja fait fonctionne, alors j'ai d'autant plus de mal à comprendre ce que je fait faux.

    Cordialement

    Ludwig
    Dernière modification par Ludwig1 ; 21/09/2016 à 09h07.

  11. #10
    bobflux

    Re : PB avec WriteFile

    SetEndOfFile sert à tronquer un fichier il me semble.

    Il faut que tu ouvres le fichier en mode append, et éventuellement faire un seek à la fin. Perso j'utilise les fopen() et fwrite() donc l'API windows...

    Citation Envoyé par Jack Voir le message
    Y a-t-il un intérêt à faire de la programmation bas niveau pour programmer des fichiers texte plutôt que d'utiliser les fonctions de la bibliothèque standard qui sont portables, bufferisées, etc.?
    Je ne sais pas si WriteFile bufferise les données dans l'espace mémoire de l'OS ou dans celui de l'application. Si on écrit de nombreuses petites lignes une par une, un buffer dans l'espace mémoire de l'application sera beaucoup plus rapide, car il évitera des context switch. Aucun intérêt d'économiser quelques instructions machine dans ce cas puisque l'opération d'IO est de toutes façons ce qui prend le plus de temps. Pour manipuler des fichiers texte, fais-le en Python ! Et les fichiers texte, c'est bon pour les logs, mais pour des données structurées bonjour... SQLite c'est bien mieux.

  12. #11
    Jack
    Modérateur

    Re : PB avec WriteFile

    Je ne sais pas si WriteFile bufferise les données dans l'espace mémoire de l'OS ou dans celui de l'application
    celui de l'application: c'est un write "amélioré", mais si j'ai le choix, je préfère fwrite en C ou std:: ostream::write en C++
    Dernière modification par Jack ; 25/09/2016 à 09h57.

  13. #12
    bobflux

    Re : PB avec WriteFile

    Hmmm, la doc n'est pas claire ! Comme je n'ai pas de compilateur sous windows là, je fais une démo sous linux (vieux laptop, Core 2 2.4 GHz)
    Le test est simple à faire : 3.5 millions de lignes/s sans flush (buffer dans l'espace mémoire user), 400K/s avec flush. Le flush impose un context switch vers l'OS et le buffer est le cache disque.
    Si quelqu'un veut faire le même en C sous windows, la réponse sera claire

    Code:
    # python
    import time
    t=time.time()
    f=open("a.txt","w")
    L = 1000000
    for _ in xrange(L):
        f.write("bonjour\n")
    #    f.flush()
    f.close()
    print L/(time.time()-t), "lignes/s"
    os.unlink("a.txt")

  14. #13
    Ludwig1

    Re : PB avec WriteFile

    Citation Envoyé par bobfuck Voir le message
    SetEndOfFile sert à tronquer un fichier il me semble.
    Il faut que tu ouvres le fichier en mode append, et éventuellement faire un seek à la fin. Perso j'utilise les fopen() et fwrite() donc l'API windows...
    .
    Salut,

    Selon Microsoft, SetEndOfFile est également utilisable pour étendre un fichier me semble t'il.
    Oui j'avais oublié de faire un seek pour mettre le pointeur en fin de fichier.
    Résultat des courses, ça écrasait toujours le début de fichier.

    Pour la vitesse d'exécution je vais faire un test.
    Cordialement

    Ludwig

Discussions similaires

  1. [JS] Sélectionner mes liens avec les flèches du clavier et les ouvrir avec la touche entrée ?
    Par Airtux dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 04/02/2014, 17h13
  2. risque jumelage gaz condensation avec une chaudière bois avec ballon tampon ?
    Par Ulyssesourd dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 19
    Dernier message: 14/05/2012, 10h12
  3. Réponses: 0
    Dernier message: 26/04/2011, 21h25
  4. Réponses: 1
    Dernier message: 25/04/2008, 07h14
  5. Port // C++ "Writefile()"
    Par JP dans le forum Électronique
    Réponses: 5
    Dernier message: 01/09/2003, 18h51