die ReadFile API bietet zwei verschiedene Arten der Ausgangsoffset einzustellen, wenn Synchron tun I/O:
- Durch Verwendung des implizit gespeicherten Dateizeigers (der über den API-Aufruf SetFilePointer manipuliert werden kann).
- Oder durch einen expliziten Offset durch die OVERLAPPED Struktur übergeben.
Ihr Code schlägt fehl, da Sie die implizit gespeicherte Dateizeiger setzen, aber dann (vermutlich) passieren eine Null-initialisiert OVERLAPPED
Struktur, die den Dateizeiger ignoriert (siehe Synchronization and File Position für weitere Informationen).
Eine der folgenden Lösungen funktioniert. Zunächst mit dem implizit gespeicherten Dateizeiger. Dies ist nützlich, wenn Sie Stücke von einer Datei in aufeinander folgenden Aufrufen lesen möchten:
hndl = CreateFileW(L"1.txt", GENERIC_READ, 0, nullptr,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
// Move the file pointer to offset 100
SetFilePointer(hndl, 100, NULL, FILE_BEGIN);
// Read contents from the current offset
DWORD dwBytesRead{0};
ReadFile(hndl, pbytReadBuffer, 100, &dwBytesRead, nullptr);
Alternativ können Sie auch eine OVERLAPPED
Struktur passieren den Offset zu übergeben. Dies ignoriert den implizit gespeicherten Dateizeiger. Es ist etwas effizienter, da es nicht zwei Aufrufe der Datei-E/A-API benötigt.
hndl = CreateFileW(L"1.txt", GENERIC_READ, 0, nullptr,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
OVERLAPPED ol{};
// Set the offset from the start of the file
ol.Offset = 100;
ReadFile(hndl, pbytReadBuffer, 100, nullptr, &ol);
Beachten Sie, dass die Fehlerbehandlung zur Verkürzung in diesen Beispielen aufgeführt ist.In echtem Code müssen Sie immer auf Fehler prüfen.
Warum übergeben Sie eine 'OVERLAPPED' Struktur an' ReadFile'? Ändere '& ol' zu' NULL'. –
Die Logik des Codes, den Sie hier skizziert haben, sieht für mich korrekt aus. Sie haben den korrekten Speicherort gesucht und anschließend einen Lesevorgang von diesem Punkt ausgeführt. Natürlich überprüfen Sie keine Rückgabewerte, daher haben Sie keine Ahnung, ob eine dieser Funktionen fehlschlägt. Es ist auch wichtig, dass Sie eine 'OVERLAPPED'-Struktur an 'ReadFile' übergeben, obwohl Sie die Datei mit der Option' FILE_FLAG_OVERLAPPED' nicht geöffnet haben. –
@CodyGray - 'OVERLAPPED' kann nicht nur mit' FILE_FLAG_OVERLAPPED' verwendet werden, sondern auch mit gesetztem Offset für Lese-/Schreiboperationen - also 'OVERLAPPED' ist absolut korrekt, eine andere Aufgabe - sind sie korrekt initialisiert? – RbMm