2009-04-08 22 views
21

que tienen un programa corto C que escribe en un archivo hasta que no hay más espacio en el disco:Límite de 2 GB en el tamaño del archivo cuando se usa fwrite en C?

#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; 
} 

Cuando ejecuto el programa (en Linux), se detiene cuando el archivo alcanza 2 GB.

¿Existe una limitación interna, debido a la estructura de ARCHIVO o algo así?

Gracias.

+2

Eso suena como el positivo 1/2 de un entero de 32 bits. –

+0

¿Con qué sistema de archivos está formateado su disco duro? – eduffy

+0

Linux dice "vfat", que es FAT32, creo. Es una unidad flash de 4GB, que inicialmente está (casi) vacía. – Gabriel

Respuesta

27

En un sistema de 32 bits (es decir, el sistema operativo es de 32 bits), de forma predeterminada, fopen y co están limitados a 32 bits de tamaño/desplazamiento/etc ... Debe habilitar el soporte de archivos de gran tamaño o utilizar * 64 bits de opciones:

http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931

Luego, su fs necesita para apoyar esto, pero a excepción de grasa y otros fs primitivos, todos ellos apoyan la creación de archivos> 2 gb.

12

se detiene cuando el archivo llega a 2 GB.

¿Existe una limitación interna, debido a en la estructura FILE, o algo así?

Esto se debe a la libc (la biblioteca C estándar), que de forma predeterminada en un sistema Linux x86 (IA-32) son funciones de 32 bits proporcionadas por glibc (Biblioteca C de GNU). Por lo tanto, por defecto, el file stream size se basa en 32 bits - 2^(32-1).

Para usar Large File Support, consulte la página 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 mayoría de los sistemas esperan que fopen (y off_t) se basen en un límite de tamaño de archivo de 2^31. Sustituirlos por off64_t y fopen64 hace que esto sea explícito, y, dependiendo del uso, podría ser la mejor manera de hacerlo. pero no se recomienda en general ya que no son estándares.

+3

Nunca use las funciones * 64. Siempre compila todos los programas con '-D_FILE_OFFSET_BITS = 64'. –

+0

Principalmente de acuerdo, ya que las funciones * 64 no son portátiles, y no están bien definidas en ninguna norma, pero hacen explícito el requisito, que puede ser bueno en algunos casos limitados. – mctylr

Cuestiones relacionadas