fopen, fseek, ftell, ... en mode 64 bits

fopen, fseek, ftell, ... en mode 64 bits - C++ - Programmation

Marsh Posté le 28-05-2003 à 10:20:09    

Bonjour,
 
J'ai écris un programme en C (Unix) qui utilise des fonctions de manipulations de fichier (fopen, fseek, ftell, ...). Or ces fonctions sont dépassées sur certains fichiers dont la taille est trop importante, il faudrait utiliser les versions 64 bits des fonctions fopen64, fread64, etc, et les types associés (off64_t). Existe-t-il une option de compilation qui permet d'indiquer au compilateur d'utiliser les versions 64 bits, ou dois-je changer tous les appels de fonction dans le code?
 
Merci
 
Edit : le compilateur, ca peut être utile : cc


Message édité par KSauzeRK le 28-05-2003 à 10:21:09
Reply

Marsh Posté le 28-05-2003 à 10:20:09   

Reply

Marsh Posté le 28-05-2003 à 10:23:21    

man ftello
man fseeko
 
pour le reste, rien n'existe (on a pas tous les jours besoin d'ecrire/lire 2**32 octets d'un seul coup)

Reply

Marsh Posté le 28-05-2003 à 10:23:47    

KSauzeRK a écrit :


Edit : le compilateur, ca peut être utile : cc  

qui est un frontend à gcc?

Reply

Marsh Posté le 28-05-2003 à 10:57:18    

Tout d'abord, merci pour ta (très rapide) réponse.
 
ok, donc j'ai besoin de remplacer uniquement ftell et fseek (et fopen aussi?) dans mon cas, je n'avais pas compris que fread64 par exemple était utilisée pour lire une grande quantité de données en un coup.
 
J'ai lu le man de ftell/ftello, qui m'a renvoyé sur le man de lf64, qui m'a renvoyé sur le man de lfcompile64 (vive les man :D).
 
Bon, j'avoue ne pas avoir tout compris, mon niveau en C Unix étant plutot modeste.
 
D'après ce que j'ai compris, je n'ai effectivement pas besoin de changer mon code pour utiliser les fonctions adéquates (ftello, fseeko).
 
J'ai tenté d'utiliser les options de compilation données en exemple dans lfcompile64 :  
 
     $ c89 -D_LARGEFILE64_SOURCE        \
           $(getconf LFS64_CFLAGS) mon_source.c  \
           $(getconf LFS64_LDFLAGS)     \
           $(getconf LFS64_LIBS)
 
mais à l'exécution, mon programme me sort toujours :
 
Erreur ouverture de big_file en lecture
Value too large for defined data type
 
Je comprends pas pourquoi ca ne fonctionne pas.
 
(Je n'ai pas compris ton allusion a cc / frontend de gcc.)


Message édité par KSauzeRK le 28-05-2003 à 10:57:46
Reply

Marsh Posté le 28-05-2003 à 11:02:52    

NAME
       fseeko, ftello - seek to or report file position
 
SYNOPSIS
       #include <stdio.h>
 
       int fseeko(FILE *stream, off_t offset, int whence);
 
       off_t ftello(FILE *stream);
 
DESCRIPTION
       The fseeko() and ftello() functions are identical to fseek() and ftell() (see fseek(3)), respectively, except that
       the offset argument of fseeko() and the return value of ftello() is of type off_t instead of long.
 
       On many architectures both off_t and long are 32-bit types, but compilation with
              #define _FILE_OFFSET_BITS 64
       will turn off_t into a 64-bit type.
 
NOTES
       These functions are found on SysV-like systems.  They are not present in libc4, libc5,  glibc  2.0  but  available
       since glibc 2.1.
 
CONFORMING TO
       The fseeko and ftello functions conform to SUSv2.

 
 
on a pas du lire le meme man
 
 
edit: c'est quoi ton système? quelle distribution?
 
perso je connais pas de fopen64, fread64... et je doute de leur existence pour les raisons evoquées précédemment


Message édité par Taz le 28-05-2003 à 11:05:16
Reply

Marsh Posté le 28-05-2003 à 11:38:55    

Euh...non, on effectivement on a pas les même man.
 
La distribution est SunOS 5.8, système : sparc.
 
Les fonctions fopen64, etc existent sur mon système, je ne sais pas si elles sont standard. Il n'y a pas de man pour ces fonctions, mais le man lf64 y fait référence, sur mon système encore une fois.
 
Bon j'ai essayé de mettre le define référencé dans ton man, ca me donne toujours la même chose.
 
J'ai remplacé le fopen par le fopen64, je n'ai plus d'erreur à l'ouverture de fichier. Je vais modifier le code, ca sera plus rapide, je n'ai malheureusement pas le temps de faire trop de recherches (c'est pour le boulot).
 
Merci pour ton aide en tout cas.

Reply

Marsh Posté le 28-05-2003 à 11:40:46    

ben je connais pas du tout SunOS, je sais meme pas s'il est SUSv2
 
avant de tester les fonctions assure toi que ton systeme/noyau supporte les fichiers larges

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed