manejo lenguaje lectura fputs fprintf escritura ejercicios binarios archivos c filesystems fwrite fat32

lenguaje - Límite de 2GB en el tamaño del archivo cuando se usa fwrite en C?



lectura y escritura de archivos en c++ (2)

Tengo un programa corto en C que escribe en un archivo hasta que no queda más espacio en el 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; }

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

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

Gracias.


se detiene cuando el archivo llega a 2GB.

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

Esto se debe a libc (la biblioteca estándar de C), que de forma predeterminada en un sistema x86 (IA-32) Linux tiene funciones de 32 bits proporcionadas por glibc (biblioteca C de GNU). Entonces, por defecto, el tamaño del flujo de archivos se basa en 32 bits - 2 ^ (32-1).

Para utilizar el soporte de archivos grandes , 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. Reemplazarlos con off64_t y fopen64 hace explícito, y dependiendo del uso puede ser la mejor manera de hacerlo. pero no se recomienda en general ya que no son estándar.


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 un tamaño de 32 bits / desplazamiento / etc ... Debe habilitar la compatibilidad con archivos grandes o usar la opción * 64 bits:

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

Entonces su fs necesita admitir esto, pero excepto fs y otros fs primitivos, todos admiten la creación de archivos> 2 gb.