Udostępnij za pośrednictwem


Funkcja Fscanf nie odczytuje kolejnych wierszy zgodnie z oczekiwaniami

W tym artykule opisano problem występujący podczas odczytywania wierszy tekstu przy użyciu Fscanf funkcji .

Oryginalna wersja produktu: Visual C
Oryginalny numer KB: 60336

Podsumowanie

Gdy plik jest otwarty w trybie tekstowym, próba odczytania wierszy tekstu przy użyciu Fscanf funkcji może zakończyć się niepowodzeniem i odczytany jest tylko jeden wiersz tekstu z pliku. Ogranicznik jest ustawiony na [^\n]wartość . Funkcja Fscanf odczytuje do góry, ale nie zawiera znaku ogranicznika. W związku z tym strumień plików zatrzymuje się po raz pierwszy \n w pliku. Kolejne Fscanf wywołania funkcji kończą się niepowodzeniem, ponieważ wskaźnik pliku pozostaje w znaku ogranicznika, a Fscanf funkcja nie może przejść do wskaźnika funkcji obok niego. Aby przenieść wskaźnik pliku obok znaku ogranicznika, użyj jednej z następujących dwóch metod:

  • Zaktualizuj kod, aby używał następującego Fscanf wywołania funkcji:

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

    Specyfikator %*c formatu odczytuje jeden znak ze strumienia wejściowego, ale nie przypisuje go do żadnego z parametrów w wywołaniu fscanf funkcji.

  • Wywołaj Fgetc funkcję po Fscanf wywołaniu funkcji, aby przenieść wskaźnik pliku poza \n znak.

Poniższy przykładowy kod demonstruje ten problem. Przykładowy kod powinien odczytywać i drukować wiersze z pliku tekstowego, dopóki nie osiągnie EOF. Jednak przykładowy kod odczytuje tylko pierwszy wiersz z pliku. Ponieważ nie znaleziono końca znaku pliku, przykładowy kod jest uruchamiany w nieskończonej pętli, jeśli strumień pliku zawiera \n znak.

Przykład kodu

FILE *stream;
char line[80];

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

W poniższym przykładzie kodu pokazano drugą metodę powyżej, aby obejść ten problem:

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