Właśnie przeczytałem odpowiedzi na „Usuwanie znaku nowej linii na końcu pliku” i wszyscy mówili, aby usunąć ostatni znak. Moje pytanie brzmi: czy eof nie jest ostatnim?
Właśnie przeczytałem odpowiedzi na „Usuwanie znaku nowej linii na końcu pliku” i wszyscy mówili, aby usunąć ostatni znak. Moje pytanie brzmi: czy eof nie jest ostatnim?
Odpowiedzi:
Plik nie kończy się znakiem końca pliku, ponieważ poprzednie odpowiedzi są prawidłowe. Myślę jednak, że odpowiedzi i komentarze zawierają pewne nieścisłości, na które warto zwrócić uwagę:
Zestaw znaków ASCII nie zawiera dokładnego znaku EOF. Istnieje kilka znaków kontrolnych „koniec”: Koniec tekstu (3), Koniec transmisji (4), Koniec bloku transmisji (23), Koniec medium (25). Separator plików (28) może być najbliżej znaku EOF. Kod 26 to „Zastępczy”, a nie EOF.
Ctrl- Djest powiązany tylko z wejściem terminalowym. Na przykład polecenie
cat filea fileb filec > outfile
nie obejmuje Ctrl- D. Nawiasem mówiąc, możesz zmienić znak terminala EOF na coś innego niż Ctrl- Dza pomocą stty
polecenia.
Ściśle mówiąc Ctrl- D(lub cokolwiek, na co się zmieniłeś) nie jest kodem klucza EOF. Co robi to zrobić read
system zwrotu rozmowę z tym, co jest wejście dostępne, podobnie jak naciśnięcie powrotu sprawia, że wywołanie systemowe read zwróci linię znaków do rozmówcy. Zgodnie z konwencją zwracana wartość zero z odczytanego wywołania systemowego (tj. Odczyt zerowych znaków) sygnalizuje koniec stanu pliku. Plik wejściowy nie jest jednak automatycznie zamykany, a jeśli dane wejściowe pochodzą z terminala, nie są wprowadzane w stan „końca pliku”. Możesz napisać program, który kontynuuje czytanie z terminala nawet po „końcu pliku”, a wywołanie odczytu może zwrócić wartość niezerową dla następnego wiersza wejściowego.
Analogię między znakami eof i eol można zobaczyć, jeśli Ctrl- Dzostanie naciśnięty, gdy jakieś wejście zostało już zapisane w wierszu. Na przykład, jeśli napiszesz „abc” i naciśniesz Ctrl- Dwywołanie read powraca, tym razem z wartością zwracaną 3 i „abc” zapisanym w buforze przekazywanym jako argument. Ponieważ odczyt nie zwraca 0, nie jest to interpretowane jako warunek EOF zgodnie z powyższą konwencją. Podobnie, naciśnięcie klawisza Return powoduje zwrócenie odczytanego połączenia z całą linią wprowadzania (w tym nową linią). Możesz to wypróbować za pomocą cat
polecenia: wpisz kilka znaków w wierszu i naciśnij Ctrl- D. Zobaczysz echa z powrotem do ciebie i cat
czeka na więcej informacji.
Wszystkie powyższe mają zastosowanie tylko wtedy, gdy terminal jest w trybie „gotowym”, w przeciwieństwie do trybu „surowego”, w którym przetwarzanie wejścia liniowego jest zminimalizowane. W trybie raw znak Ctrl-D naprawdę jest dostarczany do bufora wejściowego.
Znaki kontrolne ASCII mają definicje z lat 60. XX wieku (faktycznie poprzedzające to, co można uznać za sieć ). Nie wszystkie z tych znaków kontrolnych są używane w sposób, w jaki były wówczas definiowane dla sprzętu telekomunikacyjnego.
W systemach uniksowych EOF
znak nie jest potrzebny ; żaden nie jest używany. System może powiedzieć aplikacjom, ile bajtów znajduje się w pliku:
W niektórych innych systemach (widoczne w VMS, DOS, Windows), control-Z może działać jako znacznik końca pliku, ponieważ w starszych wersjach system nie mógł powiedzieć niektórym aplikacjom, ile bajtów jest w pliku.
W przypadku VMS ograniczenie było spowodowane sposobem działania środowiska wykonawczego C. Aplikacje w asemblerze mogły (i zrobiły) uzyskać prawidłowy rozmiar pliku.
Systemy uniksowe w powłoce konwencjonalnie używają control-D, aby powiedzieć aplikacji, że osiągnięto koniec wejścia (pliku), ale control-D nie jest zapisany w pliku.
W C EOF
jest celowo wykonany, -1
aby wskazać, że nie jest prawidłowym znakiem. Standardowe operacje we / wy zwracane są EOF
po wykryciu stanu końca pliku - nie jest to znak specjalny.
Nawiasem mówiąc, pliki nie muszą kończyć się znakiem nowej linii (znak wiersza ASCII). Edytory tekstu radzą sobie z plikami, które wszystkie są tekstem do wydrukowania, ale nie mają końca nowej linii.
busybox
„s vi
, etc).
EOF nie jest postacią. Jest to stan, który wskazuje, że nie ma więcej znaków do odczytania ze strumienia pliku. Po wprowadzeniu polecenia EOF z terminala sygnalizujesz systemowi operacyjnemu zamknięcie strumienia wejściowego, nie wpisując specjalnego znaku.
bash
wejdzie w posiadanie danych wejściowych, jest masowany przez sterownik TTY. Ten sterownik przechwytuje Ctrl-D i wysyła EOF do bash
(gdzie EOF nie jest postacią, ale specjalnym statusem pliku)