Compartilhar via


A função Fscanf não lê linhas consecutivas conforme o esperado

Este artigo descreve um problema que ocorre quando você lê linhas de texto usando a Fscanf função.

Versão original do produto: Visual C
Número original do KB: 60336

Resumo

Quando um arquivo é aberto no modo de texto, uma tentativa de ler linhas de texto usando a Fscanf função pode falhar e apenas uma linha de texto é lida do arquivo. O delimitador é definido como [^\n]. A Fscanf função lê até, mas não inclui o caractere delimitador. Portanto, o fluxo de arquivos é interrompido no primeiro \n arquivo. As chamadas de função subsequentes Fscanf falham porque o ponteiro do arquivo permanece no caractere delimitador e a Fscanf função não pode avançar o ponteiro da função além dele. Para mover o ponteiro do arquivo além do caractere delimitador, use um dos dois métodos a seguir:

  • Atualize o código para usar a seguinte Fscanf chamada de função:

    fscanf(stream, "%[^\n]%*c", line)
    

    O %*c especificador de formato lê um caractere do fluxo de entrada, mas não o atribui a nenhum dos parâmetros na fscanf chamada de função.

  • Chame a Fgetc função após a chamada de Fscanf função para mover o ponteiro do arquivo além do \n caractere.

O exemplo de código a seguir demonstra esse problema. O exemplo de código deve ler e imprimir linhas de um arquivo de texto até atingir o EOF. No entanto, o exemplo de código lê apenas a primeira linha do arquivo. Como o caractere de fim de arquivo não foi encontrado, o exemplo de código será executado em um loop infinito se o fluxo de arquivos contiver um \n caractere.

Exemplo de código

FILE *stream;
char line[80];

while ((fscanf(stream, "%[^\n]", line))!= EOF )
{
    printf("Line = %s \n",line);
}

O exemplo de código a seguir demonstra o segundo método acima para contornar esse problema:

FILE *stream;
char line[80];

while ((fscanf(stream, "%[^\n]", line))!= EOF)
{
    fgetc(stream); // Reads in '\n' character and moves file
    // stream past delimiting character
    printf("Line = %s \n", line);
}