ERLEDIGT
NEIN
NEIN
ANTWORTEN
8
8
ZUGRIFFE
935
935
EMPFEHLEN
-
26.10.07 20:16 #1
- Registriert seit
- Jan 2005
- Beiträge
- 60
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 :1 2 3 4 5 6 7 8 9
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
-
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.
Code cpp:1
file.seekg(z, ios::beg);
Aber ich glaub der Parameter ist nur optional - aber vielleicht hilfts ja.
Gruß
-
26.10.07 21:17 #3
- Registriert seit
- Jan 2005
- Beiträge
- 60
Leider geht das och net.
Habe es eben nochmals getestet ohne Erfolg.
Wie behandelt man solche Sachen ?
bis denne
-
26.10.07 21:24 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.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.Geändert von deepthroat (26.10.07 um 21:27 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
26.10.07 23:44 #5
- Registriert seit
- Jan 2005
- Beiträge
- 60
Also die Position des Dateizeigers ermittle ich so:
Code :1 2 3 4 5 6 7 8 9 10 11 12
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
-
27.10.07 11:08 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Wie es aussieht ist das eine Limitierung des von dir benutzen Kompilers/STL/C Bibliothek.
Du kannst dir das Limit so ausgeben lassen: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.Code cpp:1 2 3 4
#include <limits> #include <streambuf> cout << std::numeric_limits<std::streamsize>::max() << endl;
Du könntest mal schauen ob es 64 Bit Versionen von ftell und fseek in deiner verwendeten C Bibliothek gibt.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
27.10.07 21:36 #7
- Registriert seit
- Jan 2005
- Beiträge
- 60
Habe das mal getestet und erhalte dann als Ausgabe: 2147483647
Code :1
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
-
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...
-
Achso...
fgetpos ist die 64 BIT ANSI funktion....
Ähnliche Themen
-
Wie kann man mit hilfe von java aus einer HTML datei eine datei starten
Von AppleSeed im Forum JavaAntworten: 1Letzter Beitrag: 05.03.08, 15:10 -
[C#] Kanäle aus Stereo WAV Datei in je eine neue WAV Mono Datei schreiben
Von Webrat im Forum .NET Grafik und SoundAntworten: 2Letzter Beitrag: 12.02.08, 18:21 -
seekg zeigt bei Dateizugriff nicht gewünschte Wirkung
Von nitgun im Forum C/C++Antworten: 2Letzter Beitrag: 09.04.07, 18:07 -
Datei öffnen und Text in JTextArea einfügen bzw. Datei speichern in txt-File
Von freihsve im Forum JavaAntworten: 4Letzter Beitrag: 19.09.06, 10:09 -
Datei Zugriff über Applet durch eine Policy - Datei
Von Kian_the_klingon im Forum JavaAntworten: 0Letzter Beitrag: 31.07.04, 20:23





Zitieren

Login






