Ctrl + D ma dziwny wpływ. Nie zamyka strumienia wejściowego, ale tylko powoduje, że poziom C fread()
zwraca pusty wynik. W przypadku zwykłych plików taki wynik oznacza, że plik jest już na końcu, ale można przeczytać więcej, np. aby sprawdzić, czy ktoś w międzyczasie napisał więcej danych do pliku.
Ponadto istnieją problemy z buforowaniem --- trzy poziomy z nich!
Pythonowa iteracja pliku blokuje buforowanie. Unikaj czytania z interaktywnych strumieni.
Plik stdin poziomu C ma domyślnie bufor linii.
sam zacisk (!), W trybie domyślnym („tryb gotowane”), odczytuje jedną linię danych przed wysłaniem go do procesu, co wyjaśnia, dlaczego wpisując Ctrl + D nie ma dowolny efekt po wpisaniu w środku linii.
Ten przykład unika się pierwszy problem, który jest wszystko, czego potrzebujesz, jeśli chcesz to wykrywanie Ctrl + D wpisane jako własnej linii:
import sys
while True:
line = sys.stdin.readline()
print repr(line)
Ci co linię ostateczny '\n'
, z wyjątkiem sytuacji, gdy "linia" pochodzi od Ctrl + D, w takim przypadku otrzymasz tylko ''
(ale czytanie trwa, chyba że oczywiście dodajemy if line == '': break
).
Jaką powłokę używasz? – squiguy
Aha, i musisz dwukrotnie wprowadzić "CTRL-D". –
Dwukrotne wejście do CTRL-D 2 nie działa. –