J'ai examiné un certain nombre de réponses concernant la compilation du code pour qu'il puisse lire/écrire des fichiers au-delà du maximum de 4 Go autorisé par les décalages de fichiers de 32 bits. Je n'ai pas de chance avec les solutions "simples" que je trouve.
L'essentiel est que j'ai Ubuntu Server 11.10 sur un petit ordinateur portable (architecture Intel 32 bits). J'essaie de lire un fichier unicode qui fait 343868522737 octets (0x50102940f1). La machine Ubuntu continue de penser qu'il est beaucoup plus petit (0x102940f1), ce qui s'avère être seulement les 32 bits inférieurs d'un vrai fichier de taille 64 bits.
J'ai écrit un petit programme que j'ai compilé sur MacOS et sur Ubuntu. Le Mac semble se comporter correctement, mais pas la boîte Ubuntu.
Le petit programme se trouve ci-dessous. Bien que j'aie commenté un bloc de code, cela n'est vraiment nécessaire que pour le Mac. L'environnement Ubuntu compilera les deux blocs de code sans problème - et générera exactement la même réponse pour les deux blocs.
// Necessary for Ubuntu build?
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64
//#include <features.h>
// finish Ubuntu
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <limits.h>
#include <wchar.h>
#include <wctype.h>
#include <locale.h>
// Ubuntu version
off64_t fileMaxLen(FILE* fin) {
off64_t fmaxlen = 0;
if( (fin!=NULL) && (fseeko64(fin,0,SEEK_END) == 0) ) {
fmaxlen = ftello64(fin);
fprintf(stdout,"fileMaxLen(): file length is: %#lx \n",(long unsigned int)fmaxlen);
fseeko64(fin,0,SEEK_SET);
}
}
// Mac OS version
//off_t fileMaxLen(FILE* fin) {
// off_t fmaxlen = 0;
// if( (fin!=NULL) && (fseeko(fin,0,SEEK_END) == 0) ) {
// fmaxlen = ftello(fin);
// fprintf(stdout,"fileMaxLen(): file length is: %#lx \n",(long unsigned int)fmaxlen);
// fseeko(fin,0,SEEK_SET);
// }
//}
main(int argc, char* argv[]) {
char fname[255];
char *locale;
FILE* f = NULL;
locale = setlocale(LC_ALL, "");
if( argc>=2 ) {
// get the file for segmenting
memset(fname, '\0', 255);
sprintf(fname,"%s",argv[1]);
fprintf(stdout,"Opening: %s\n",fname);
f = fopen(fname,"r");
fileMaxLen(f);
fprintf(stdout,"Done!\n");
} else {
fprintf(stdout,"Need a filename\n");
}
}
Enregistrez l'extrait sous le nom de file_test.c, la compilation est alors très simple.
gcc fichier_test.c
Exécutez ensuite le fichier a.out
Avez-vous des suggestions pour que ce code reconnaisse les fichiers au-delà de cette limite de 32 bits ? Pour l'instant, je ne sais plus où j'en suis.