C-programação ftell fseek fread, o tamanho de leitura de um arquivo
Pergunta
Eu tenho um arquivo. Eu li o tamanho do arquivo. Então ciclo I ler dois bytes em um tempo até eu chegar ao final do arquivo. Depois de cada operação de leitura I incrementar a posição atual por 2, no entanto, a posição não se incrementado depois que eu chegar a metade do tamanho do arquivo, a operação fread lerá 0 bytes.
o programa lê o tamanho do arquivo. I executar fread (2 bytes cada vez) até que a posição corrente é igual ao tamanho do ficheiro. Ele lê 22915 byes para o tamanho do arquivo Ele incrementa posição por 2 após cada leitura, no entanto, quando a posição atual chega a 11459 que é metade do tamanho do arquivo ele irá ler zero bytes indo assim em um loop infinito.
FILE *file;
char *file_name;
int readCount = 0;
int position = 0;
int fileSize;
unsigned short mem_accesses;
file_name = "sample.txt";
/** open the file */
file = fopen(file_name, "rb");
fseek(file, 0, SEEK_END);
fileSize = ftell(file);
rewind(file);
while(position<fileSize){
mem_accesses = getNumberAccesses();
printf("position: %d filesize: %d\n",position, fileSize);
}
unsigned short getNumberAccesses(){
/** calculate number of accesses for process */
unsigned short val;
readCount = fread(&val, sizeof(val), 2, file);
position += readCount;
printf("read count: %d\n", readCount);
return val;
}
Solução
readCount = fread(&val, sizeof(val), 2, file);
Esta declaração lê dois itens de dois bytes cada. E ele retorna o valor 2 , para o número de artigos lidos. Os segundo e terceiro parâmetros multiplicados juntos dizer fread
quantos bytes para ler.
Outras dicas
FREAD retornar o número de elementos ler, não o número de bytes.
(Aliás, em seu código por engano dar-lhe uma contagem de elementos de 2, que causa um estouro de buffer).
Você deve verificar o valor de retorno do fread para que você não vai correr em loops infinitos em caso de erros.
Em vez de consulta para o tamanho do arquivo, eu simplesmente chamar fread (ou outras funções de entrada) em um loop até o fim do arquivo.