Czy fseek (stdin, 1, SEEK_SET) lub rewind (stdin) może być użyty do opróżnienia bufora wejściowego zamiast nieprzenośnego fflush (stdin)?
Odkąd odkryłemfflush(stdin)
nie jest przenośnym sposobem radzenia sobie ze znanym problemem„nowa linia czai się w buforze wejściowym”, Korzystałem z poniższego, kiedymusieć posługiwać sięscanf
:
while((c = getchar()) != '\n' && c != EOF);
Ale dziś natknąłem się na tę linię, którą zauważyłemcplusplus.com na fflush:
fflush () ... w plikach otwartych do aktualizacji (tj. otwartych zarówno do odczytu, jak i zapisu), strumień zostanie opróżniony po operacji wyjściowej przed wykonaniem operacji wejściowej. Można to zrobić przez repozycjonowanie (fseek, fsetpos, przewijanie do tyłu) lub wywołanie jawnie fflush
W rzeczywistości przeczytałem to już wiele razy. Chcę więc potwierdzić, czy mogę po prostu użyć kogokolwiek z poniższych przedscanf()
służyć temu samemu celowifflush(stdin)
służy, gdy jest obsługiwany:
fseek(stdin,1,SEEK_SET);
rewind(stdin);
PS rewind(stdin)
Wydaje się całkiem bezpieczne i sprawne, aby opróżnić bufor, czy się mylę?
Błąd Powinienem był wspomniećfseek(stdin,0,SEEK_SET)
jeśli o tym rozmawiamystdin
ponieważ nie możemy użyć żadnego przesunięcia innego niż 0 lub zwróconego przezftell()
w tym wypadku.