Uma das coisas que me chama a atenção na linguagem C é a sua flexibilidade.
Ontem um amigo me mostrou um código de um analisador léxico, que está trabalhando para uma matéria da faculdade e vi que estava lendo um arquivo de texto e testando seus tokens a cada iteração do loop, em quanto não era fim do arquivo. Eu então sugeri que ele fizesse a leitura do arquivo para a memória e aí começou a dúvida. Como ler um arquivo em C diretamente para a memória?
Segue a solução que pode ajudar mais pessoas com esta mesma dúvida:
#include <stdio.h>
int main(int argc, char *argv[])
{
char *mem;
int size;
FILE *f;
f = fopen("arquivo.txt", "rb");
if (f == NULL) exit(1);
fseek(f, 0, SEEK_END);
size = ftell(f);
fseek(f, 0, SEEK_SET);
mem = (char *)malloc(size+1);
if (size != fread(mem, sizeof(char), size, f)) {
free(mem);
exit(2);
}
fclose(f);
free(mem);
return 0;
}
Como podemos perceber neste código, para obter o tamanho do arquivo, primeiramente usamos a função fseek() para posicionar o ponteiro dentro do arquivo, passando como referência SEEK_END que faz com que o ponteiro seja posicionado no final do arquivo. Logo depois chamamos a função ftell() que retorna a quantidade de bytes no arquivo, do início até a posição do ponteiro. Como posicionamos o ponteiro no final do arquivo, ele retornará o tamanho do arquivo em bytes.
Retornamos então o ponteiro para o inicio do arquivo, chamando novamente a função fseek() e passando para ela o argumento SEEK_SET, que irá posicionar o ponteiro novamente no início do arquivo.
Depois de alocar memória, utilizando a função malloc, lemos o arquivo para dentro da variável mem utilizando a função fread(), que retorna a quantidade de bytes lidos. Neste retorno, comparamos se a quantidade de bytes lidos corresponde a quantidade de bytes do arquivo. Caso não seja verdadeiro, ele emitirá um erro e saíra do programa, liberando a memória.
Para mais informações para fseek(), ftell() e fread() e outras funções para tratamento de arquivos, visite o endereço: http://www.cplusplus.com/reference/clibrary/cstdio/
Breno

0 comentários:
Postar um comentário