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 > outfilenie obejmuje Ctrl- D. Nawiasem mówiąc, możesz zmienić znak terminala EOF na coś innego niż Ctrl- Dza pomocą sttypolecenia.
Ściśle mówiąc Ctrl- D(lub cokolwiek, na co się zmieniłeś) nie jest kodem klucza EOF. Co robi to zrobić readsystem 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ą catpolecenia: wpisz kilka znaków w wierszu i naciśnij Ctrl- D. Zobaczysz echa z powrotem do ciebie i catczeka 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 EOFznak 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 EOFjest celowo wykonany, -1aby wskazać, że nie jest prawidłowym znakiem. Standardowe operacje we / wy zwracane są EOFpo 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.
bashwejdzie 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)