WriteFile + [FILE_FLAG_NO_BUFFERING] + <windows.h>
-
Hallo,
ich habe eine Frage bezüglich des Schreibens in eine Datei mit der WriteFile-Methode aus der windows.h.
Ich muss mit einem eigenen Buffer in eine Textdateischreiben, dies wäre kein Problem wenn ich bei CreateFile nicht denn System-Cache/Buffer abstellen müsste. Da ich das nun aber muss, kann ich nur ein vielfaches der Sektorgröße(512 Bytes) auf einmal schreiben. Wenn ich jetzt aber nur einen String wie "Hallo Test" in eine Textdateischreiben möchte habe ich ein Problem. Da der Rest mit [NULL] beschrieben wird. Genau das möchte ich aber nicht. Bisher sieht mein Test-Code so aus:DWORD dwBytesWritten = 0; char DataBuffer[] = "This is a test string."; char filename[] = "C:\\out.txt"; hFile = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING, NULL); if (hFile == INVALID_HANDLE_VALUE) { cout << "Could not open file (error " << GetLastError() << ")" << endl; return; } cout << WriteFile(hFile, DataBuffer, 512, &dwBytesWritten, NULL) << endl;Sobald ich nun die 512 in zum Beispiel die Länge des Strings ändere kann schlägt die WriteFile-Funktion fehl.
Hat jemand einen Tipp oder eine Idee?
Mit freundlichen Grüßen
NajjannajP.S. Ich muss sowohl die Windows.h benutztn und die WriteFile Methode, leider keine andere Wahl.
-
Dieser Thread wurde von Moderator/in Phoemuex aus dem Forum 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.
-
Mit SetEndOfFile kannst du die Datei kürzen
-
Wieso willst du unbedingt FILE_FLAG_NO_BUFFERING nutzen? Windows buffered doch selber gar nicht so schlecht?
Oder willst du eigentlich das hier: FILE_FLAG_WRITE_THROUGH ("Write operations will not go through any intermediate cache, they will go directly to disk.")?
-
Ich muss laut Vorgabe "FILE_FLAG_NO_BUFFERING" benutzen, daher komme ich da nicht drum herum. Gibt es noch eine andere Möglichkeit?
-
Ich muss laut Vorgabe
Warum so eine Vorgabe?
Simon
-
Studiums-Vorgabe des Professors mit Notenabzug für mit internem Buffering...
-
Dann musst du wohl wie schon vorgeschlagen wurde mehr schreiben als nötig und dann mit SetEndOfFile() die Datei auf die richtige Länge kürzen.
-
Hallo,
SetEndOfFile() hat ja keine Parameter, daher verstehe ich noch nicht so ganz wie cih dann zum beispiel nach 50Zeichen abschneiden soll, da ich ja immer 512Byte auf einmal schreibe. Kann mir das jemand näher erklären?
Danke!
-
Du setzt vorher den Filepointer auf die entsprechende Stelle:
http://msdn.microsoft.com/en-us/library/aa365541(VS.85).aspx
-
Leider kann ich mit SetFilePointer auch immer nur 512(oder ein vielfaches davon) nach vorne oder nach hinten springen.. daher bringt mir das leider nichts
Noch andere Ideen?
-
Hier beisst sich die Katze in den Schwanz. Wenn Du kein Buffering verwendest dann kanst Du eben nur auf den Boundaries navigieren.
Lesen bildet

http://msdn.microsoft.com/en-us/library/aa365541(VS.85).aspxIf an application calls SetFilePointer with distance to move values that result in a position not sector-aligned and a handle that is opened with FILE_FLAG_NO_BUFFERING, the function fails, and GetLastError returns ERROR_INVALID_PARAMETER.
Es macht auch NULL-Sinn FILE_FLAG_NO_BUFFERING zu verwenden und dann eine nicht alignierte Dateigröße zu nutzen!
-
Okay, hat sich erledigt, habe mit dem Prof. gesprochen und ich soll die restliche Datei einfach mit Whitspaces füllen.. es wäre einfach nur um denn Umgang mit Buffern zu verstehen. Danke an alle!