Dando continuidade ao estudo de manipulação de arquivos com a linguagem C, vamos aprender nesta aula como ler texto de um arquivo com a função fgets.
A função fgets recebe três parâmetros: onde salvar o que será lido; a quantidade máxima de caracteres que pode ser lido e de onde será lido. Ela retorna a quantidade de caracteres que de fato foram lidos.
Se você está acompanhando o curso aqui do canal você deve se lembrar que já utilizamos esta função para ler texto do teclado. A diferença agora é que, como desejamos ler texto de um arquivo, vamos trocar o terceiro parâmetro que era stdin (teclado, a entrada padrão do computador) pelo ponteiro para o arquivo que desejamos ler, assim:
// lendo texto de um arquivo
fgets(texto, 499, file)
Observe que a função como escrita acima lê até encontrar um ENTER (uma quebra de linha) ou no máximo 499 caracteres, que é o tamanho do nosso vetor.
Agora podemos percorrer todo nosso arquivo, lendo e imprimindo no terminal enquanto não encontrarmos o fim do arquivo, assim:
// lendo um arquivo até o final
while(!feof(file)){
if(fgets(texto, 499, file))
printf("\n--> %s", texto);
}
Talvez você esteja se perguntando por que do teste (if) dentro do while. É simples. No procedimento da aula anterior, após a escrita de cada linha, foi inserido uma quebra de linha a fim de separar cada linha de texto. Assim, após lermos a última linha de texto, ainda terá uma quebra de linha no arquivo, por isso não será identificado ainda o fim do arquivo. O teste dentro do while ainda será verdadeiro e uma nova linha será lida do arquivo. Acontece que esta nova linha possui apenas a quebra de linha. Como a função fgets lê até a quebra de linha, a quantidade de caracteres lidos será zero (lembra que em C zero é falso?), logo, não podemos imprimir nosso vetor que contêm a última frase lida e já impressa.
Código de exemplo completo em C para ler arquivo texto com a função fgets
/*
Aula 212: Como ler linhas de texto com a função fgets?
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 texto[500];
if(file) {
printf("Digite uma frase ou 1 caracter para finalizar:\n");
scanf("%499[^\n]", texto);
scanf("%c");
while(strlen(texto) > 1){
fputs(texto, file);
fputc('\n', file);
scanf("%499[^\n]", texto);
scanf("%c");
}
fclose(file);
} else
printf("\nERRO ao abrir arquivo!\n");
}
void ler(char f[]) {
FILE *file = fopen(f, "r");
char texto[500];
if(file){
printf("\n\tTexto lido do arquivo\n");
while(!feof(file)){
if(fgets(texto, 499, file))
printf("\n--> %s", texto);
}
fclose(file);
}
else
printf("\nERRO ao abrir arquivo!\n");
}
int main() {
char nome[] = {"conto.txt"};
escrever(nome);
ler(nome);
return 0;
}
