Dando continuidade ao estudo de manipulação de arquivos texto com a linguagem C em nosso Curso de Programação C, vamos aprender hoje como ler um arquivo com a função fscanf.
Na aula anterior aprendemos que a função fprintf é similar à função printf, ou seja, “imprime” informações em um arquivo texto. Isso leva a crer que a função fscanf seja similar à função scanf, lendo informações de um arquivo texto.
É exatamente isso. Da forma como usamos a função scanf para ler informações a partir do teclado, podemos usar a função fscanf para ler informações de um arquivo texto, exatamente da mesma forma.
Na aula anterior escrevemos em um arquivo o nome, a idade e a altura de três pessoas. Para ler estas mesmas informações com a função fscanf basta informarmos de qual arquivo será feita a leitura, quais tipos de dados serão lidos e onde serão salvos, assim:
// lendo nome, idade e altura de um arquivo texto com a função fscanf
fscanf(file, "%s%d%f", nome, &idade, &altura)
A linha de código acima irá ler uma linha do arquivo. Como ler todos as linhas do arquivo?
É simples ler todas as linhas do arquivo e para isso podemos utilizar o retorno da própria função fscanf. Ela retorna a quantidade de itens lidos ou -1 se não conseguir ler, ou seja, se encontrar o fim do arquivo. Assim, basta executarmos a leitura enquanto o retorno for diferente de -1, assim:
// lendo todas as linhas do arquivo
while(fscanf(file, "%s%d%f", nome, &idade, &altura) != -1)
printf("\n\tNome: %s\n\tIdade: %d\n\tAltura: %.2f\n", nome, idade, altura);
Como foi dito na aula anterior, perceba que escrita e leitura em arquivo texto estão diretamente relacionados. A forma como os dados foram escritos podem facilitar ou dificultar sua leitura.
Código de exemplo completo em C para ler um arquivo texto com a função fscanf
/*
Aula 214: Como ler um arquivo de texto com a função fscanf?
Código escrito por Wagner Gaspar
Junho de 2021
Modos de abertura de arquivos:
w -> Escrita
r -> leitura
a -> anexar
r+ -> leitura e escrita
w+ -> leitura e escrita (apaga o conteúdo caso o arquivo exista)
a+ -> leitura e escrita (adiciona ao final do arquivo)
*/
void escrever(char f[]) {
FILE *file = fopen(f, "w");
char nome[100];
int opcao, idade;
float altura;
if(file) {
do{
printf("Digite nome, idade e altura: ");
scanf("%100[^\n]%d%f", nome, &idade, &altura);
fprintf(file, "%s %d %.2f\n", nome, idade, altura);
printf("\nDigite 1 para inserir outro registro. ");
scanf("%d", &opcao);
scanf("%c");
}while(opcao == 1);
fclose(file);
} else
printf("\nERRO ao abrir arquivo!\n");
}
void ler(char f[]) {
FILE *file = fopen(f, "r");
char nome[100];
int idade;
float altura;
if(file){
printf("\tDados lidos do arquivo:\n");
while(fscanf(file, "%s%d%f", nome, &idade, &altura) != -1)
printf("\n\tNome: %s\n\tIdade: %d\n\tAltura: %.2f\n", nome, idade, altura);
fclose(file);
}
else
printf("\nERRO ao abrir arquivo!\n");
}
int main() {
char nome[] = {"conto.txt"};
escrever(nome);
ler(nome);
return 0;
}
