límite de 2 GB de tamaño de archivo cuando se utiliza fwrite en C?
-
06-09-2019 - |
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.
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.