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; }