limite di 2 GB alla dimensione del file quando si usa fwrite in C?
-
06-09-2019 - |
Domanda
Ho un breve programma C che scrive in un file fino a quando non v'è più spazio su disco:
#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;
}
Quando eseguo il programma (in Linux), si ferma quando il file raggiunge 2 GB.
C'è una limitazione interna, a causa della struttura del file, o qualcosa del genere?
Grazie.
Soluzione
In un sistema a 32 bit (vale a dire il sistema operativo è di 32 bit), per impostazione predefinita, fopen e co sono limitati a 32 bit dimensioni / offset / ecc ... È necessario attivare il supporto del file, o utilizzare il * 64 opzione bit:
http: // www. gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931
Allora il tuo fs ha la necessità di sostenere questo, ma tranne fs primitivi grassi e altri, tutti supportano la creazione di file> 2 gb.
Altri suggerimenti
si ferma quando il file raggiunge 2 GB.
C'è una limitazione interna, a causa alla struttura dei file, o qualcosa del genere?
Questo è dovuto alla libc (la libreria standard C), che di default su un x86 (IA-32) Sistema di Linux è funzioni a 32 bit fornite da glibc (C Library di GNU). Quindi per default il dimensioni flusso di file si basa su 32-bit -. 2 ^ (32-1)
Per usare Large File Support , vedere la pagina 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;
}
Nota: La maggior parte dei sistemi si aspettano fopen (e off_t) a basarsi su limite di dimensione 2 ^ 31 file. La loro sostituzione con off64_t
e fopen64
rende esplicito, e a seconda dell'uso potrebbe essere il modo migliore per andare. , ma non è raccomandato, in generale, in quanto sono non standard.