8gb-dateien auf 32-bit betriebssystemen

dettus

Bicycle User
hallo.
das ist zwar konkret ein linux-problem, aber vielleicht koennt ihr mir trotzdem dabei helfen.

und zwar, ich wuerde gerne in der lage sein grosse (>8gb) dateien zu bearbeiten. auf 64bit-maschinen ist das ja nicht so das problem. aber bei 32bit stehe ich gerade etwas auf dem schlauch.

wisst ihr zufaellig was ich an die ... schreiben muss damit es SAUBER funktioniert?
Code:
#include <stdio.h>
// number 1: datatypes

typedef unsigned char           tUInt8;
typedef unsigned short          tUInt16;
typedef unsigned int            tUInt32;
typedef unsigned long long      tUInt64;

typedef signed char             tInt8;
typedef signed short            tInt16;
typedef signed int              tInt32;
typedef signed long long        tInt64;

#ifdef 64BIT
typedef FILE*                   tFptr;

// number 2: file operations
inline  tUInt64 getfilesize(tFptr f)
{

        fseek(f,0,SEEK_END);
        return (tUInt64)ftell(f);
}
inline  void    setfilepos(tFptr f,tUInt64 pos)
{
        fseek(f,pos,SEEK_SET);
}
#else
...
#endif
 
Moin,

ich wuerde sagen, einfach die ueblichen Funktionen verwenden und Large File Support aktivieren, wenn's denn noch notwendig ist.

Ein paar Infos gibts hier.

Im Wesentlichen gibt es wohl zwei Defines:

Code:
#define _FILE_OFFSET_BITS 64
#define _LARGEFILE64_SOURCE

Wenn du diese beim Compile setzt, sollte das wohl funktionieren. Fuer Offsets usw. sollte dann aber off_t verwendet werden, weil der dann als 64bit Datentyp definiert wird.

HTH
 
Es gibt die fseeko() und ftello() Funktionen, die den Typ off_t verwenden. Ich glaube das ist immer 64Bit. Auf die ifdefs würde ich verzichten.
 
Laut der von mir referenzierten Manpage ist der Typ off_t nicht immer 64bit. Moeglicherweise ist die Manpage auch alt und inzwischen ist das nicht mehr umzuschalten. Ich wuerde mich jedoch darauf nicht verlassen wollen.

Vielleicht einfach mal mit sizeof(off_t) pruefen, wie gross der ist. ;)
 
OK, ich habe keine Beschreibung dazu gefunden. Dann gibt es noch fgetpos() und fsetpos():
Code:
The fgetpos() and fsetpos() functions are alternate interfaces for
retrieving and setting the current position in the file, similar to
ftell() and fseek(), except that the current position is stored in an
opaque object of type fpos_t pointed to by pos.  [B]These functions provide
a portable way to seek to offsets larger than those that can be repre‐
sented by a long int. ...[/B]
 
fpos_t hab ich leider noch nicht geschafft sauber in irgendeine zahl-variable zu casten.
das einzige was ich dafuer jetzt zusammengegoogelt habe waren einigige komische konstrukte mit memcpy().
 
Zuletzt bearbeitet:
fpos_t hab ich leider noch nicht geschafft sauber in irgendeine zahl-variable zu casten.
das einzige was ich dafuer jetzt zusammengegoogelt habe waren einigige komische konstrukte mit memcpy().

Bin ja nur Laie, aber wie ist denn fpos_t in den zugehorigen header files definiert? Auf FreeBSD amd64 bzw i386 ist es long bzw long long (u.a.). Wird ja an manchen Stellen automatisch richtig gecastet vom Compiler ansonsten kannst du ja nach int64_t casten, das sollte dann ja erstmal gross genug sein.

Und wozu machst du dann eigentlich die ganzen typedefs am Anfang? Die meisten ueblichen Integer Typen gibt's doch schon in stdint.h?
 
Zurück
Oben