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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top