Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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łaniufscanf
funkcji.Wywołaj
Fgetc
funkcję poFscanf
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);
}