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;
}
Foi útil?

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.

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