Hallo, ich habe ein kleines C++-Programm geschrieben, mit dem ich aus einer Datei lesen und in dieser einige Änderungen vornehmen will. Ich benutze ifstream. Nun will ifstream aber nicht mit Dateien ab einer Größe von 2GB (weil der Position-Pointer nicht mehr schafft?). Wie lese ich aus Dateien > 2GB bzw. schreibe in diesen? Bei C-Funktionen wird scheinbar nur ein long zur Positionierung verwendet, also ist da auch bei 2GB Schluss? Danke für Eure Hilfe. Gruß, Christian
Hi Christian! Christian Schneider schrieb am 02.06.2005 15:33 :
ich habe ein kleines C++-Programm geschrieben, mit dem ich aus einer Datei lesen und in dieser einige Änderungen vornehmen will. Ich benutze ifstream. Nun will ifstream aber nicht mit Dateien ab einer Größe von 2GB (weil der Position-Pointer nicht mehr schafft?).
Wie lese ich aus Dateien > 2GB bzw. schreibe in diesen? Bei C-Funktionen wird scheinbar nur ein long zur Positionierung verwendet, also ist da auch bei 2GB Schluss?
Das hängt extrem vom verwendeten Compiler ab. Ab g++ 3.4 sollte es mit C++ möglich sein. Auf [1] steht zumindest dies: | Large File Support (files larger than 2 GB on 32-bit systems). Für den gcc gibt es Compilerflags: -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE Gruß, Michael [1] http://gcc.gnu.org/gcc-3.4/changes.html
Michael Wenger wrote:
Hi Christian!
Christian Schneider schrieb am 02.06.2005 15:33 :
ich habe ein kleines C++-Programm geschrieben, mit dem ich aus einer Datei lesen und in dieser einige Änderungen vornehmen will. Ich benutze ifstream. Nun will ifstream aber nicht mit Dateien ab einer Größe von 2GB (weil der Position-Pointer nicht mehr schafft?).
Wie lese ich aus Dateien > 2GB bzw. schreibe in diesen? Bei C-Funktionen wird scheinbar nur ein long zur Positionierung verwendet, also ist da auch bei 2GB Schluss?
Das hängt extrem vom verwendeten Compiler ab. Ab g++ 3.4 sollte es mit C++ möglich sein. Auf [1] steht zumindest dies: | Large File Support (files larger than 2 GB on 32-bit systems).
Für den gcc gibt es Compilerflags: -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
Gruß, Michael
Außerdem könnte es am Filesystem liegen. ext2 hatte früher z.B. ein 2GB-Limit... Falls das Filesystem mitspielt, könnte evtl. auch Memory Mapped I/O helfen (einfach mal man mmap und weitere...). Dann verhält sich die Datei wie Speicher (also wilde Zeigerspiele!). Gruß, Dierk
Hallo! Am Donnerstag, 2. Juni 2005 16:53 schrieb Dierk Fröhling:
Michael Wenger wrote:
Christian Schneider schrieb am 02.06.2005 15:33 :
Wie lese ich aus Dateien > 2GB bzw. schreibe in diesen? Bei C-Funktionen wird scheinbar nur ein long zur Positionierung verwendet, also ist da auch bei 2GB Schluss?
Das hängt extrem vom verwendeten Compiler ab. Ab g++ 3.4 sollte es mit
C++ möglich sein. Auf [1] steht zumindest dies: | Large File Support (files larger than 2 GB on 32-bit systems).
Werde mal einen neueren installieren.
Für den gcc gibt es Compilerflags: -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
Die muss ich bei gcc >= 3.4 mit angeben? Wo ist sowas dokumentiert (auf gcc.gnu.org findet sich dazu nichts)?
Außerdem könnte es am Filesystem liegen. ext2 hatte früher z.B. ein 2GB-Limit...
Nein, das spielt mit. Die Datei ist schon vorhanden und liegt auf einem recht neuen (= jünger als 2 Jahre) ext3 Dateisystem.
Falls das Filesystem mitspielt, könnte evtl. auch Memory Mapped I/O helfen (einfach mal man mmap und weitere...). Dann verhält sich die Datei wie Speicher (also wilde Zeigerspiele!).
Das werde ich mal im Hinterkopf behalten, allerdings wäre mir was halbwegs idiotensicheres schon lieber. Das mit den Zeigern klingt gar nicht danach. ;-) Danke für die Hinweise. Gruß, Christian
Hallo, Am Fri, 03 Jun 2005, Christian Schneider schrieb:
Am Donnerstag, 2. Juni 2005 16:53 schrieb Dierk Fröhling:
Michael Wenger wrote: [..]
Für den gcc gibt es Compilerflags: -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
Die muss ich bei gcc >= 3.4 mit angeben? Wo ist sowas dokumentiert (auf gcc.gnu.org findet sich dazu nichts)?
Das sind keine Compilerflags in dem Sinne. Siehe die Option '-D' in info gcc. Das sind also die defines die ich auch genannt habe, aber eben per Kommandozeile. -dnh -- [die 1970er Jahre] Die Zeit, in der Joschka Fischer seine kriminelle Karierre beendete, und Helmut Kohl seine so richtig durchstartete... -- Matthias Brodowy im "SR Gesellschaftsabend"
On Fri, 2005-06-03 at 16:56 +0200, Christian Schneider wrote:
Hallo!
Am Donnerstag, 2. Juni 2005 16:53 schrieb Dierk Fröhling:
Michael Wenger wrote:
Christian Schneider schrieb am 02.06.2005 15:33 :
Wie lese ich aus Dateien > 2GB bzw. schreibe in diesen? Bei C-Funktionen wird scheinbar nur ein long zur Positionierung verwendet, also ist da auch bei 2GB Schluss?
Das hängt extrem vom verwendeten Compiler ab. Ab g++ 3.4 sollte es mit
C++ möglich sein. Auf [1] steht zumindest dies: | Large File Support (files larger than 2 GB on 32-bit systems).
Werde mal einen neueren installieren.
Für den gcc gibt es Compilerflags: -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
Die muss ich bei gcc >= 3.4 mit angeben?
Wo ist sowas dokumentiert z.B. in /usr/include/features.h
(auf gcc.gnu.org findet sich dazu nichts)? Es ist ein glibc-Feature und ein Kernel-Feature, mit dem GCC nur sehr entfernt etwas zu tun.
Durch die defines teilst du der GLIBC über den Compiler mit, dass davon ausgegangen wird, dass der Kernel "large files" (>2GB) unterstützt.
Außerdem könnte es am Filesystem liegen. ext2 hatte früher z.B. ein 2GB-Limit... Sehr lange ist's her.
Nein, das spielt mit. Die Datei ist schon vorhanden und liegt auf einem recht neuen (= jünger als 2 Jahre) ext3 Dateisystem. Auf den Kernel kommt es an ...
Bei SuSE gab es da mal eine "4GB"-Kernel o.ä. Ralf
Hallo, Am Sat, 04 Jun 2005, Ralf Corsepius schrieb:
On Fri, 2005-06-03 at 16:56 +0200, Christian Schneider wrote: [..]
Nein, das spielt mit. Die Datei ist schon vorhanden und liegt auf einem recht neuen (= jünger als 2 Jahre) ext3 Dateisystem. Auf den Kernel kommt es an ...
Bei SuSE gab es da mal eine "4GB"-Kernel o.ä.
Nein, die Suse "-4GB" Kernel waren fuer RAM groesser 1 GB und kleiner 4 GB. -dnh -- Und Ich dachte schon diese Art von Gerücht sei ein Gerücht. [WoKo in dag°]
Hallo! Ich habe jetzt schon eine ganze Weile damit zugebracht zu versuchen ein RPM eines neuen gcc für meinen Rechner zu bauen, das parallel zu den gcc-RPMs von SuSE installiert werden kann. Als Basis habe ich das Spec von SuSE 9.0's gcc-3.3.1 benutzt. Es sind einige Header-Files hinzugekommen, die ich nicht ganz einordnen kann, die ich aber erst mal in die Reihe der im %install Teil gelöschten Header gepackt habe. Ist das korrekt oder lösche ich da was noch Nützliches oder gar Essenzielles? (Wo kommen die her?) rm -rf /opt/gcc344/lib/gcc/i586-suse-linux/3.4.4/include/cdrecord rm -rf /opt/gcc344/lib/gcc/i586-suse-linux/3.4.4/include/curses rm -f /opt/gcc344/lib/gcc/i586-suse-linux/3.4.4/include/emmintrin.h rm -rf /opt/gcc344/lib/gcc/i586-suse-linux/3.4.4/include/net rm -f /opt/gcc344/lib/gcc/i586-suse-linux/3.4.4/include/obstack.h rm -rf /opt/gcc344/lib/gcc/i586-suse-linux/3.4.4/include/rpc rm -rf /opt/gcc344/lib/gcc/i586-suse-linux/3.4.4/include/valgrind Warum werden libffi und libiberty kompiliert, aber dann wieder gelöscht? Braucht man die wirklich nicht (bzw. nie)? Danke. Gruß, Christian
Hallo, Am Thu, 02 Jun 2005, Christian Schneider schrieb:
Wie lese ich aus Dateien > 2GB bzw. schreibe in diesen? Bei C-Funktionen wird scheinbar nur ein long zur Positionierung verwendet, also ist da auch bei 2GB Schluss?
Du musst dafuer sorgen, dass _LARGEFILE_SOURCE und _FILE_OFFSET_BITS=64
definiert sind. Dann bekommst du deinen 64bittigen off_t und Largefile
faehigen stdio. Ob das mit iostream dann auch geht weiss ich nicht.
==== test_off_t.c ====
#define _LARGEFILE_SOURCE
#define _FILE_OFFSET_BITS 64
#include
Hallo! Am Donnerstag, 2. Juni 2005 16:46 schrieb David Haller:
Du musst dafuer sorgen, dass _LARGEFILE_SOURCE und _FILE_OFFSET_BITS=64 definiert sind. Dann bekommst du deinen 64bittigen off_t und Largefile faehigen stdio. Ob das mit iostream dann auch geht weiss ich nicht.
#define _LARGEFILE_SOURCE #define _FILE_OFFSET_BITS 64
Ich habe die beiden Zeilen hinzugefügt, aber die Datei wird trotzdem nicht erfolgreich geöffnet. Bleibt wohl nichts als gcc zu updaten!? Danke trotzdem. Gruß, Christian
Hallo, Am Fri, 03 Jun 2005, Christian Schneider schrieb:
Am Donnerstag, 2. Juni 2005 16:46 schrieb David Haller:
Du musst dafuer sorgen, dass _LARGEFILE_SOURCE und _FILE_OFFSET_BITS=64 definiert sind. Dann bekommst du deinen 64bittigen off_t und Largefile faehigen stdio. Ob das mit iostream dann auch geht weiss ich nicht.
#define _LARGEFILE_SOURCE #define _FILE_OFFSET_BITS 64
Ich habe die beiden Zeilen hinzugefügt, aber die Datei wird trotzdem nicht erfolgreich geöffnet.
Welche Fehlermeldung(en) bekommst du denn? Und wie oeffnest du die Datei? Und ist off_t auch 8 Byte gross? -dnh --
The three "R"s of Microsoft support: Retry, Reboot, Reinstall You forgot one: Repeat -- Mark Atwood, Lars Balker Rasmussen
Hallo! Am Freitag, 3. Juni 2005 20:03 schrieb David Haller:
Welche Fehlermeldung(en) bekommst du denn? Und wie oeffnest du die Datei? Und ist off_t auch 8 Byte gross?
Also, bei mir wollte g++ erst kompilieren, wenn ich zusätzlich den streambuf header eingebunden habe. Dann kommt als Ausgabe auch 8 raus. Das Öffnen der Datei habe ich mit ifstream blabla("datei"); versucht. Als Resultat erhalte ich auf die Abfrage, ob blabla true ist, ein false. Ich habe bei ifstream keine Möglichkeit gefunden, wie ich weitere Infos zum Fehler erhalten kann (vielleicht gibt es welche, aber ich habe ehrlich gesagt vor kurzem erst mit C++ richtig angefangen und steh oft noch ziemlich ratlos rum, wenn was schief läuft). Gruß, Christian
Hallo, Am Sat, 04 Jun 2005, Christian Schneider schrieb:
Am Freitag, 3. Juni 2005 20:03 schrieb David Haller:
Welche Fehlermeldung(en) bekommst du denn? Und wie oeffnest du die Datei? Und ist off_t auch 8 Byte gross?
Also, bei mir wollte g++ erst kompilieren, wenn ich zusätzlich den streambuf header eingebunden habe. Dann kommt als Ausgabe auch 8 raus.
Das Öffnen der Datei habe ich mit ifstream blabla("datei"); versucht. Als Resultat erhalte ich auf die Abfrage, ob blabla true ist, ein false. Ich habe bei ifstream keine Möglichkeit gefunden, wie ich weitere Infos zum Fehler erhalten kann (vielleicht gibt es welche, aber ich habe ehrlich gesagt vor kurzem erst mit C++ richtig angefangen und steh oft noch ziemlich ratlos rum, wenn was schief läuft).
Hm. C++ muesste ich jetzt auch nachlesen. Aber sinnvoll waere es wohl,
mal generell zu testen, ob es bei dir geht. Z.B. in C:
====
#define _LARGEFILE_SOURCE
#define _FILE_OFFSET_BITS 64
#include
On Sat, 2005-06-04 at 06:38 +0200, David Haller wrote:
Hallo,
Bei mir klappt das uebrigens nicht, ich bekomme da
SIGXFSZ (File size limit exceeded)
und nen coredump. Entweder am Kernel oder an der GLIBC.
$ uname -r 2.4.25-1l $ /lib/libc.so.6 | head -n 1 GNU C Library stable release version 2.1.3, by Roland McGrath et al. $ gcc --version pgcc-2.95.3
Nun ja, ...
Genau das gleiche aber auch mit:
$ LD_LIBRARY_PATH=/opt/gcc/3.3.5/lib /opt/gcc/3.3.5/bin/gcc --version gcc (GCC) 3.3.5
Woran's bei mir liegt weiss ich leider auch nicht. AFAIK sind bei mir eigentlich alle relevanten Teile LFS faehig (Kernel + Ext3, libc und zumindest obiges Testprogramm ;) Und ich meine, ich haette sogar mal ne Datei >2GB auf der Platte gehabt... Mein System sollte eben inzwischen weitgehend LFS-faehig sein, aber irgendeine Altlast stoert noch. Allerdings ist mein System auch inzwischen 6 Jahre alt :) Und bisher hatte ich erst 2mal Bedarf fuer eine Datei > 2 GB (1 HDD Image fuer jemand anderen und ein (unkomprimiertes) Video ;)
Ich tippe auf fehlenden large file-support im Kernel. Ralf
Hallo, Am Sat, 04 Jun 2005, Ralf Corsepius schrieb:
On Sat, 2005-06-04 at 06:38 +0200, David Haller wrote:
$ uname -r 2.4.25-1l $ /lib/libc.so.6 | head -n 1 GNU C Library stable release version 2.1.3, by Roland McGrath et al. $ gcc --version pgcc-2.95.3
Nun ja, ...
*g*
Genau das gleiche aber auch mit:
$ LD_LIBRARY_PATH=/opt/gcc/3.3.5/lib /opt/gcc/3.3.5/bin/gcc --version gcc (GCC) 3.3.5 [..] Ich tippe auf fehlenden large file-support im Kernel.
Weisst du, was man da einstellen muss? Meines Wissens habe ich da alles richtig. -dnh --
Noooo.... Not "She offered her honor, he honored her offer"? ...and so all evening he was honour and offer. -- in asr
Hallo! Am Samstag, 4. Juni 2005 06:38 schrieb David Haller: [C-Code]
Achtung: ich habe das jetzt noch in der Mail etwas veraendert, kann sein, dass da Fehler drin sind.
Funktioniert. Die Ausgabe war wie in deinen Kommentaren. Der Compiler hat übrigens bei (off_t)2247483648 gemeckert: Warnung: this decimal constant is unsigned only in ISO C90 Aber das macht wohl nichts.
Aufpassen muss man nur, dass man nicht in die "sparse-file" Falle laeuft, wo AFAIK Fehler auftreten, wenn die Datei "echt" ueber 2 GB gross wird, d.h. man muesste > 2 GB schreiben...
Das ist kein Problem (hier war die Datei echt > 2GB):
==============
#define _LARGEFILE_SOURCE
#define _FILE_OFFSET_BITS 64
#include
Achso, du koenntest auch ein C-Proggie auf ne vorhandene Datei loslassen... (im Prinzip 'open' statt dem 'mkstemp' und 'read' statt 'write' nach dem lseek oben (da musst du aber dem read noch nen Buffer anlegen). Und natuerlich kein "unlink" (auch bei der Fehlerbehandlung nicht) ;)
s.o.
Bei mir klappt das uebrigens nicht, ich bekomme da
SIGXFSZ (File size limit exceeded)
und nen coredump.
Bei mir gehts gut. :-) Was nun? Gruß, Christian
participants (5)
-
Christian Schneider
-
David Haller
-
Dierk Fröhling
-
Michael Wenger
-
Ralf Corsepius