WriteFile und Objekte



  • Hallo,

    ich möchte gern einen struct in eine Datei schreiben unter Verwendung von writeFile (WINAPI).

    Folgender Code:

    // Datei wird im Schreibmodus geöffnet
    
    struct test {
      int id;
      wchar_t name[50];
      bool b;
    } testElem;
    
    struct test a;
      a.id = 1;
      wcscpy(a.name, L"blaaa");
      a.b = false;
    
    DWORD bytesWrote = 0;
    WriteFile(myHandle->journal, &a, sizeof(testElem), &bytesWrote, NULL);
    
    // Datei wird geschlossen und wieder im Schreibmodus geöffnet
    
    struct test b;
    DWORD bytesRead = 0;
    ReadFile(myHandle->journal, &b, sizeof(testElem), &bytesRead, NULL);
    

    Danach steht in b zwar was drin, aber leider nur Müll.

    Wäre nett, wenn mich jemand auf meinen Fehler hinweisen könnte. 🙂

    Vielen Dank und MFG,
    Ronny



  • du machst in CreateFile was falsch.



  • Das sieht wie folgt aus:

    Lesemodus

    myHandle->journal = CreateFile(pathToJournal, FILE_READ_DATA, NULL, NULL, OPEN_ALWAYS, NULL, NULL);
    

    Schreibmodus

    myHandle->journal = CreateFile(pathToJournal, FILE_WRITE_DATA, NULL, NULL, OPEN_ALWAYS, NULL, NULL);
    

    Mfg



  • nimm doch fwrite.
    mfg,
    a.



  • Ok, ich weiß nicht, was ich vorher anders gemacht habe, aber der Code funktioniert nun auf einmal. Sowohl lesen als auch schreiben klappen.

    Achso, und ich habe gehört, dass WriteFile besser sein soll als fwrite. Deswegen verwende ich es. Allerdings konnte mir noch keiner den genauen Unterschied erläutern.

    Danke für die Hilfe,
    MFG



  • Ronny2 schrieb:

    Achso, und ich habe gehört, dass WriteFile besser sein soll als fwrite. Deswegen verwende ich es. Allerdings konnte mir noch keiner den genauen Unterschied erläutern.

    auf windoofs-boxen ruft 'fwrite' WriteFile auf, das ruft ZwWriteFile auf und das wiederum ruft NtWriteFile auf, usw. je weiter unter in der hierarchie man sich befindet, desto mehr einflussmöglichkeiten hat man.
    🙂



  • Vielen Dank für die Infos.

    MFG



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Warum soll WriteFile besser sein als fwrite?
    Blödfug... 🙂



  • Keine Ahnung. Ich hatte nur in verschiedenen Blogs und Foren gelesen, dass es wohl irgendwie einen Unterschied in der Performance und dem Caching gibt.

    Aber wie gesagt, ich würd es ja selber gern genauer wissen. 😉


  • Mod

    Ronny2 schrieb:

    Keine Ahnung. Ich hatte nur in verschiedenen Blogs und Foren gelesen, dass es wohl irgendwie einen Unterschied in der Performance und dem Caching gibt.

    Aber wie gesagt, ich würde es ja selber gern genauer wissen. 😉

    Richtig: die CRT Funktionen haben noch einen Puffer und flushen erst ab einer bestimmten Größe. Die WriteFile Funktionen chachen auch. Es hängt davon ab was und wieviel Du schreiben willst.

    Sind es kleine unregelmäßige Daten (Zeilen), ist die CRT vermutlich schneller. Sind die Chunks groß und gleichförmig hat vermutlich die CRT Funktion die Nase vorne. Das wird sich aber kaum messen lassen.

    Meine Erfahrung: Die umgebeneden Algorithmen sind bei den meisten Programmierern so schlecht geschrieben, dass ein Unterschied in diesen Funktionen auf gar keinen Unterschied macht und man mehr Intelligenz an andere Stellen stecken sollte. 🤡



  • Hallo.

    FILE_READ_DATA habe ich im Zusammenhang mit CreateFile noch nie benutzt. GENERIC_READ aber schon, und das gab noch nie Ärger. Das sieht dann z.B. so aus:

    m_hCom = CreateFile(com[i],GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);

    Gruss

    Lars


Log in to reply