Datei >2GB seekg() ?


Tach,

Ick hab ne Datei die is 3.5GB gross nun wollte ich diese öffnen und dabei
den Dateizeiger mit seekg() auf Position 3.4GB setzen um von der Position an
dann die Daten aus der Datei in eine andere zu schreiben.

Der Dateizeiger lässt sich aber nicht setzen und ergibt immer Position 0,
da der Wert über 2GB geht.

Code:
        char datei[] = "d:\\123.bin"; // Test-Datei grösser als 2GB
        fstream file(datei,ios_base::in|ios_base::binary);  // Datei binär öffnen

        if(!file.is_open())
                return;  //Zugriff nicht möglich;

        unsigned long int Z = 3400000000;
        file.seekg(Z);
In der letzten Zeile soll mit seekg der DateiZeiger auf Position 3400000000 gesetzt werden aber die Position ist immer 0.

Weiss jemand ob das überhaupt geht ? oder wie man das machen kann ?

bis denne
 

radazong

Mitglied
Hi.
Ich bin mir ja nicht sicher ob es dir bei deinem Problem hilft, aber du musst doch noch angeben, von welcher Position aus du den Zeiger weitersetzten möchtest.

C++:
file.seekg(z, ios::beg);
Aber ich glaub der Parameter ist nur optional - aber vielleicht hilfts ja.

Gruß
 

deepthroat

Erfahrenes Mitglied
Hi.
Aber ich glaub der Parameter ist nur optional - aber vielleicht hilfts ja.
Ja, die Methode ist überladen. Mit einem Parameter wird die Position relativ vom Dateibeginn verändert.

@Kleiner Wicht: Wie überprüfst du denn wo der Zeiger steht?

Gruß

PS: Kann natürlich sein, das deine benutzte C Bibliothek das so nicht unterstützt. Dann könntest du es aber schrittweise machen: erstmal bis 2G und dann noch 1,3GB weiter ab der aktuellen Position.
 
Zuletzt bearbeitet:
Also die Position des Dateizeigers ermittle ich so:

Code:
        char datei[] = "d:\\123.bin"; // Test-Datei grösser als 2GB
        fstream file(datei,ios_base::in|ios_base::binary);  // Datei binär öffnen

        if(!file.is_open())
                return;  //Zugriff nicht möglich;

        unsigned long int Z = 1024;   // 2147483647
        file.seekg(Z);

        unsigned long int p = file.tellg();
        ShowMessage(p);                       //Ausgabe der DateizeigerPosition
Wenn ich nun den DateiZeiger auf 2147483647 + 1 setze und versuche
ab dieser Stelle auszulesen fängt er bei Position 0 an zu lesen und nicht bei
Pos 2147483648, jedenfalls stehen dann in meinen buffer die Daten vom Anfang der Datei drin und nicht diese ab Pos 2147483648.

Aber wenn ich nun den Dateizeiger auf Position 2147483647 setze und
dann beginne mit lesen dann geht er drüber über die 2147483647 bytes und
liesst die Datei aus.

Ich kann aber manuell den DateiZeiger nicht über 2147483647 bytes setzen dann beginnt er bei 0.

Wie soll ich also nun an eine Position springen die
erst über 2147483647 bytes beginnt , wenn er dann auf 0 springt ?

Vielleicht gehts ja doch irgendwie ?

bis denne
 

deepthroat

Erfahrenes Mitglied
Hi.

Wie es aussieht ist das eine Limitierung des von dir benutzen Kompilers/STL/C Bibliothek.

Du kannst dir das Limit so ausgeben lassen:
C++:
#include <limits>
#include <streambuf>

cout << std::numeric_limits<std::streamsize>::max() << endl;
Wenn es nicht irgendwo einen Schalter wie _LARGEFILE_SOURCE oder _FILE_OFFSET_BITS bei deiner verwendeten Bibliothek gibt, wirst du mit den IOStreams nicht weiter kommen.

Du könntest mal schauen ob es 64 Bit Versionen von ftell und fseek in deiner verwendeten C Bibliothek gibt.

Gruß
 
Habe das mal getestet und erhalte dann als Ausgabe: 2147483647

Code:
cout << std::numeric_limits<std::streamsize>::max() << endl;
Habe nur 32Bit Versionen zu ftell und fseek gefunden wenn ich mich da nich irre.
Jedenfalls geht der Wertebereich nur bis 2147483647 -> int bzw. long int.

bis denne
 

bueyuekt

Grünschnabel
Ist jetzt zwar etwas her, aber vielleicht hilft es dir.

du verwendest zum einen unsigned long. Der ist aber auf 2 GB begrenzt. Du musst
den datentyp ändern. long long oder fpos_t sollte da helfen.

Zusätzlich kannst du dir ja die ANSI funktion fsetpos anschauen.

PS: ich arbeite nicht mit Borland...