Usando a função fread:o tamanho a ser lido é maior que o disponível para leitura

StackOverflow https://stackoverflow.com//questions/10705158

  •  13-12-2019
  •  | 
  •  

Pergunta

Eu tenho uma pergunta:

Estou usando fread para ler um arquivo.

typedef struct {
    int ID1;
    int ID2;
    char string[256];
} Reg;

Reg *A = (Reg*) malloc(sizeof(Reg)*size);

size = FILESIZE/sizeof(Reg);

fread (A, sizeof(Reg), size, FILEREAD);

Usando um loop, chame esta chamada consecutivamente, para me fazer ler todo o arquivo.

O que acontecerá quando eu chegar perto do final do arquivo, e não conseguir ler "size" * sizeof(Reg), ou se você só tiver disponibilidade para ler metade dessa quantidade, o que acontecerá com meu array A.Será concluído?A função retornará um erro?

Sabendo como o arquivo foi lido pelo fread?

Edição1:Exatamente, se a divisão não for exata, quando eu ler o último bit de tamanho de arquivo menor que vou ler coisas que não estão no arquivo, fico pensando com meu redimensionamento de vetor para a quantidade de bytes que posso ler, ou desenvolver uma dinâmica melhor.

Foi útil?

Solução

pão retorna o número de registros lidos.Qualquer coisa além disso em seu buffer pode ser mutilada, não confie nesses dados.

Fread retorna o número de itens completos realmente lidos, que podem ser menores do que contagem se ocorrer um erro ou se o final do arquivo for encontrado antes de atingir a contagem.

A função não irá ler além do final do arquivo:a ocorrência mais provável é que você obtenha vários buffers completos e, em seguida, uma leitura parcial (final) do buffer, a menos que o tamanho do arquivo seja um múltiplo exato do comprimento do buffer.

Sua lógica precisa acomodar isso - o tamanho do arquivo fornece o número total esperado de registros, portanto não deve ser difícil ignorar os dados finais no buffer (após o final fread chamada) que corresponde a registros não inicializados.Um contador de “registros restantes para leitura” seria uma abordagem.

Outras dicas

fread() retorna o número de elementos que ele pode ler.Então você tem que verificar o valor de retorno de fread() para descobrir quantos elementos em sua matriz são válidos.

Ele retornará uma contagem curta de itens ou zero se ocorreu um erro ou EOF foi alcançado.Você terá que usar feof() outro ferror() neste caso, para verificar qual condição foi atendida.

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