Ausführen von Dateioperationen mit 64-Bit-Adressen in C + MinGW32

9

Ich versuche, eine 24-GB-XML-Datei in C einzulesen, aber es wird nicht funktionieren. Ich drucke die aktuelle Position unter Verwendung von ftell () aus, während ich es einlese, aber sobald es zu einer ausreichend großen Zahl kommt, geht es zurück zu einer kleinen Zahl und beginnt von vorne, wobei nicht einmal 20% durch die Datei gehen. Ich nehme an, dies ist ein Problem mit dem Bereich der Variablen, die verwendet wird, um die Position zu speichern (Long), die nach Ссылка , während meine Datei 25.000.000.000 Bytes groß ist. Eine lange lange sollte funktionieren, aber wie würde ich ändern, was mein Compiler ( Cygwin / mingw32 ) verwendet oder erhält es fopen64?

    
zacaj 14.10.2009, 20:39
quelle

6 Antworten

3

Die Funktion ftell() gibt normalerweise unsigned long zurück, was bei 32-Bit-Systemen nur bis zu 2 32 Bytes (4 GB) reicht. Sie können also den Dateioffset für eine 24-GB-Datei nicht in eine 32-Bit-Datei "co_de%" einfügen.

Sie haben möglicherweise die Funktion long verfügbar, oder die Standardfunktion ftell64() kann Ihnen einen größeren Offset zurückgeben.

    
David R Tribble 14.10.2009 20:42
quelle
3

Sie können versuchen, die vom Betriebssystem bereitgestellten Dateifunktionen CreateFile und ReadFile zu verwenden . Laut dem Thema Dateizeiger wird die Position als 64-Bit-Wert gespeichert .

    
Dolphin 14.10.2009 20:57
quelle
0

Wenn Sie nicht wie von Loadmaster empfohlen eine 64-Bit-Methode verwenden können, müssen Sie die Datei wahrscheinlich aufbrechen.

Diese Ressource scheint darauf hinzuweisen, dass es möglich ist, _telli64 () zu verwenden. Das kann ich aber nicht testen, da ich mingw nicht verwende.

    
Adrian Mouat 14.10.2009 21:01
quelle
0

Ich kenne keine Möglichkeit, dies in einer Datei zu tun, ein bisschen wie ein Hack, aber wenn das Aufteilen der Datei nicht richtig ist, könnten Sie ein paar Funktionen schreiben, die die Datei temporär aufteilen Das verwendet ftell (), um sich durch die Datei zu bewegen, und tauscht ftell () in eine neue Datei aus, wenn sie den Teilungspunkt erreicht, und dann eine andere, die die Dateien wieder zusammenfügt, bevor sie beendet wird. Ein absolut verpfuschter Ansatz, aber wenn keine bessere Lösung ans Licht kommt, könnte dies ein Weg sein, die Arbeit zu erledigen.

    
Toby 14.10.2009 21:39
quelle
0

Ich habe die Antwort gefunden. Anstatt fopen, fseek, fread, fwrite ... zu benutzen, benutze ich _open, lseeki64, lese, schreibe. Und ich kann schreiben und suchen in & gt; 4GB Dateien.

Bearbeiten: Es scheint, dass die letzteren Funktionen ungefähr 6x langsamer sind als die vorherigen. Ich werde jedem die Belohnung geben, der das erklären kann.

Edit: Oh, ich habe hier gelernt, dass read () und Freunde ungepuffert sind. Was ist der Unterschied zwischen read () und fread ()? >

    
Fantius 02.02.2012 01:57
quelle
-1

Auch wenn die Datei ftell () in der Microsoft C-Bibliothek einen 32-Bit-Wert zurückgibt und somit offensichtlich falsche Werte zurückgibt, sobald Sie 2 GB erreicht haben, sollte das Lesen der Datei immer noch gut funktionieren. Oder musst du auch in der Datei suchen? Dafür benötigen Sie _ftelli64 () und _fseeki64 ().

Beachten Sie, dass Sie im Gegensatz zu einigen Unix-Systemen kein spezielles Flag benötigen, wenn Sie die Datei öffnen, um anzuzeigen, dass sie sich im "64-Bit-Modus" befindet. Die zugrunde liegende Win32-API verarbeitet große Dateien problemlos.

    
tml 15.02.2010 20:07
quelle