Pregunta

Tengo un programa corto 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;
}

Al ejecutar el programa (en Linux), se detiene cuando el archivo alcanza 2 GB.

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

Gracias.

¿Fue útil?

Solución

En un sistema de 32 bits (es decir, el sistema operativo es de 32 bits), por defecto, fopen y co están limitados a 32 bits de tamaño / desplazamiento / etc ... Es necesario para que el soporte de archivos grandes, o utilizar el * 64 opción bits de:

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

A continuación, el FS tiene que apoyar esto, pero a excepción fs primitivos grasa y otros, todos ellos apoyan la creación de archivos> 2 gb.

Otros consejos

  

que se detenga cuando el archivo alcanza 2 GB.

     

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

Esto es debido a la libc (la biblioteca estándar de C), que de forma predeterminada en un x86 (IA-32) sistema Linux es funciones de 32 bits proporcionados por glibc (C Biblioteca de GNU). Así que por defecto el tamaño flujo de archivos se basa en 32 bits -. 2 ^ (32-1)

Para usar Soporte de archivos grandes , ver 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 exige que fopen (y off_t) que se basan en límite de tamaño de 2 ^ 31 archivos. Reemplazándolos con off64_t y fopen64 lo explicita, y dependiendo del uso que podría ser el mejor camino a seguir. pero no se recomienda en general, ya que no son estándar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top