limite de 2GB no tamanho do arquivo ao usar fwrite em C?
-
06-09-2019 - |
Pergunta
Eu tenho um programa curto C que escreve em um arquivo até que não haja mais espaço no 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;
}
Quando eu executar o programa (em Linux), ele pára quando o arquivo atinge 2 GB.
Existe uma limitação interna, devido à estrutura do arquivo, ou algo assim?
Graças.
Solução
Em um sistema de 32 bits (ou seja, o OS é 32 bits), por padrão, fopen e co são limitados ao tamanho de 32 bits / deslocamento / etc ... Você precisa ativar o suporte a arquivos grandes, ou usar o * 64 opção pedaços:
http: // www. gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931
Em seguida, suas necessidades fs para suportar isso, mas com exceção de gordura e outros fs primitivos, todos eles suportam arquivos criando> 2 gb.
Outras dicas
ele pára quando o arquivo atinge 2 GB.
Existe uma limitação interna, devido para a estrutura do arquivo, ou algo assim?
Este é devido ao libc (a biblioteca C standard), que por padrão em um x86 (IA-32) do sistema Linux é funções de 32 bits fornecidos pela glibc (C Biblioteca do GNU). Então, por padrão o tamanho do arquivo fluxo baseia-se 32-bits - 2 ^ (32-1)
.Para usar Suporte a arquivos grandes , consulte a 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: A maioria dos sistemas esperar fopen (e off_t) a ser baseado em limite de tamanho de 2 ^ 31 arquivo. Substituindo-os por off64_t
e fopen64
torna isso explícito, e, dependendo do uso poderia ser melhor caminho a percorrer. mas não é recomendado em geral, como eles são não-padrão.