limite de 2 Go la taille du fichier lors de l'utilisation fwrite en C?
-
06-09-2019 - |
Question
J'ai un programme court C qui écrit dans un fichier jusqu'à ce qu'il n'y a pas plus d'espace sur le disque:
#include <stdio.h>
int main(void) {
char c[] = "abcdefghij";
size_t rez;
FILE *f = fopen("filldisk.dat", "wb");
while (1) {
rez = fwrite(c, 1, sizeof(c), f);
if (!rez) break;
}
fclose(f);
return 0;
}
Quand je lance le programme (sous Linux), il arrête lorsque le fichier atteint 2 Go.
Y at-il une limite interne, en raison de la structure du fichier, ou quelque chose?
Merci.
La solution
Sur un système 32 bits (à savoir le système d'exploitation est de 32 bits), par défaut, fopen et co sont limités à 32 taille bits / offset / etc ... Vous devez activer le support des grands fichiers, ou utiliser le * 64 possibilité de bits:
http: // www. gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931
Ensuite, votre fs doit prendre en charge, mais à l'exception de graisse et d'autres fs primitifs, tous les fichiers> supportent la création de 2 Go.
Autres conseils
il arrête lorsque le fichier atteint 2 Go.
Y at-il une limitation interne, en raison à la structure du fichier, ou quelque chose?
Ceci est dû à la libc (la bibliothèque standard C), qui par défaut sur un x86 (IA-32) Le système Linux est fonction de 32 bits fournis par glibc (Bibliothèque GNU C). Donc, par défaut, le taille du flux de fichier est basée sur 32 bits -. 2 ^ (32-1)
Pour utiliser Grand Support de fichiers, consultez la page Web.
#define _FILE_OFFSET_BITS 64
/* or more commonly add -D_FILE_OFFSET_BITS=64 to CFLAGS */
#include <stdio.h>
int main(void) {
char c[] = "abcdefghij";
size_t rez;
FILE *f = fopen("filldisk.dat", "wb");
while (1) {
rez = fwrite(c, 1, sizeof(c), f);
if ( rez < sizeof(c) ) { break; }
}
fclose(f);
return 0;
}
Note: La plupart des systèmes attendent fopen (et off_t) soient basées sur 2 ^ 31 limite de taille de fichier. en les remplaçant par off64_t
et fopen64
en fait explicite, et selon l'utilisation pourrait être le meilleur moyen d'aller. mais n'est pas recommandé en général car ils ne sont pas standard.