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

3 minutos de lectura

avatar de usuario
gabriel

Tengo un programa corto en C que escribe en un archivo hasta que no hay 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 2 GB.

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

Gracias.

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

    – Joel Coehoorn

    8 de abril de 2009 a las 16:12

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

    – eduff

    8 de abril de 2009 a las 16:13

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

    – gabriel

    8 de abril de 2009 a las 16:19

  • vfat (FAT32) tiene un límite de 2 GB por archivo de todos modos, no importa lo que uses para codificarlo.

    –Mike Cooper

    8 de abril de 2009 a las 16:36

  • support.microsoft.com/kb/314463 XP tiene un límite de tamaño de archivo FAT de 4GB-1B. Pensé que el vfat de Linux se limitaría a 2 GB, pero ahora que leo el código fuente creo que me equivoqué.

    – efímero

    8 de abril de 2009 a las 19:09

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/desplazamiento/etc. de 32 bits… Debe habilitar la compatibilidad con archivos grandes o utilizar 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 fat y otros fs primitivos, todos ellos admiten la creación de archivos> 2 gb.

avatar de usuario
mctylr

se detiene cuando el archivo alcanza los 2 GB.

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

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

Para usar Soporte de archivos grandesconsulte 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. reemplazándolos con off64_t y fopen64 hace esto 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ándar.

  • Nunca use las funciones *64. Compile siempre todos los programas con -D_FILE_OFFSET_BITS=64.

    – R.. GitHub DEJA DE AYUDAR A ICE

    8 de mayo de 2011 a las 1:32

  • Mayormente de acuerdo, ya que las funciones *64 no son portátiles y no están bien definidas en ningún estándar, pero hacen que el requisito sea explícito, lo que puede ser bueno en algunos casos limitados.

    – mctylr

    10 mayo 2011 a las 20:33

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad