Por que fgets é melhor que fscanf para leitura segura de arquivos em C

7

Pare de usar fscanf para ler arquivos de texto. É uma armadilha. A menos que seus dados estejam perfeitamente formatados até o último espaço em branco, fscanf irá engasgar, desalinhar e deixar você depurando um pesadelo. O caminho confiável? Abra no modo r, use fgets para capturar linhas inteiras e analise as peças necessárias depois.

Esta é uma maneira simples de ler um arquivo e despejar seu conteúdo na tela sem travar o sistema.

A lógica aqui é aparentemente simples. fgets lê uma linha de até 1.000 caracteres neste buffer e retorna NULL somente quando atinge o marcador de fim de arquivo. Ele imprime diretamente no stdout via printf. Observe a falta de \n na string de formato printf? Isso é intencional. fgets anexa automaticamente o caractere de nova linha ao final da string que lê. Se você adicionar seu próprio \n, obterá espaçamento duplo. Mais importante ainda, se uma linha tiver mais de 1.000 caracteres, fgets não adicionará a nova linha. Você pode detectar essa leitura incompleta verificando a falta de \n, um truque útil se você estiver lidando com dados malformados.

“Use fgets para ler cada linha e depois analise as peças que você precisa.”

Há um erro crítico que atrapalha até mesmo os desenvolvedores experientes. Não digite fclose como close. O compilador não irá capturá-lo. A função close existe e, para pequenos scripts que abrem e fecham um arquivo apenas uma ou duas vezes, pode parecer funcionar bem. É uma mentira.

Se você executar isso dentro de um loop, close não conseguirá liberar adequadamente os recursos do arquivo subjacente. Eventualmente, seu programa fica sem identificadores de arquivo ou espaço de memória disponíveis e trava fortemente. fclose é a única maneira correta de fechar a porta. close é um atalho que leva a um tijolo. Atenha-se à biblioteca padrão. Mantenha seus buffers verificados. Não deixe um erro de digitação consumir sua memória.