Я просто прочитав відповіді на тему "Видалення символу нового рядка в кінці файлу", і всі сказали, щоб видалити останній символ. Моє запитання: чи не останній символ eof?
Я просто прочитав відповіді на тему "Видалення символу нового рядка в кінці файлу", і всі сказали, щоб видалити останній символ. Моє запитання: чи не останній символ eof?
Відповіді:
Файл не закінчується символом Кінець файлу, як правильно вказано в попередніх відповідях. Але я думаю, що відповіді та коментарі містять деякі неточності, на які варто звернути увагу:
Набір символів ASCII не містить точного символу EOF. Існує кілька контрольних символів "кінця": Кінець тексту (3), Кінець передачі (4), Кінець блоку передачі (23), Кінець середовища (25). File Separator (28), можливо, наближається до символу EOF. Код 26 - "Замінник", а не EOF.
Ctrl- Dасоціюється лише з термінальним входом. Наприклад, команда
cat filea fileb filec > outfileне включає Ctrl- D. До речі, ви можете змінити символ терміналу EOF на щось інше, ніж Ctrl- Dза допомогою sttyкоманди.
Власне кажучи, Ctrl- D(або все, що ви змінили) не є ключовим кодом EOF. Що це робить, це зробити readповернення системного виклику з тим, який вхід є, так само як натискання клавіші return повертається до прочитаного системного виклику поверненням рядка символів до абонента. За умовою, повернене нульове значення з системного виклику читання (тобто зчитування нульових символів) сигналізує про закінчення стану файлу. Однак вхідний файл не закривається автоматично, і, якщо вхід надходить з терміналу, він не ставиться в стан "кінець файлу". Ви можете написати програму, яка продовжує читати з терміналу, навіть після "закінчення файлу", і виклик читання може повернути не нуль для наступного рядка введення.
Аналогія між символами eof та eol можна побачити, якщо Ctrl- Dнатиснуто, коли на рядку вже записано деякий вхід. Наприклад, якщо ви пишете "abc" і натискаєте Ctrl- Dчитання дзвінка повертається, цього разу зі значенням повернення 3 та з "abc", що зберігається в буфері, передається як аргумент. Оскільки читання не повертає 0, це не трактується як умова EOF вищезгаданою конвенцією. Аналогічно, натискання клавіші return для повернення зчитуваного дзвінка робить увесь рядок введення (включаючи новий рядок). Ви можете спробувати це за допомогою catкоманди: напишіть кілька рядків у рядку та натисніть Ctrl- D. Ви побачите, як персонажі повторюються до вас і catчекаєте додаткового введення.
Все вищезазначене застосовується лише тоді, коли термінал перебуває в режимі "приготування", на відміну від "сировинного" режиму, в якому обробка введення рядків зводиться до мінімуму. У сирому режимі символ Ctrl-D дійсно передається у вхідний буфер.
Контрольні символи ASCII мають визначення 1960-х років (фактично передуючи тому, що ви можете вважати мережею ). Не всі ці символи управління використовуються так, як вони були визначені для телекомунікаційного обладнання тоді.
У системах, подібних Unix, немає потреби в EOFперсонажі; жоден не використовується. Система може вказати програмам, скільки байтів у файлі:
У деяких інших системах (видно у VMS, DOS, Windows), control-Z може діяти як маркер кінця файлу, оскільки в старих версіях система не могла сказати деяким програмам, скільки байтів у файлі.
У випадку з VMS, обмеження було пов’язане з тим, як працює час виконання C. Програми на мові збірки можуть (і зробили) отримати правильний розмір файлу.
Системи Unix в оболонці звичайно використовують control-D, щоб повідомити програмі, що досягнуто кінця вводу (файлу), але контроль-D не зберігається у файлі.
В C EOFце спеціально зроблено, -1щоб вказати, що він не є дійсним символом. Стандартні введення / виведення повертаються, EOFколи виявляється стан кінця файлу - не спеціальний символ.
До речі, файли не повинні закінчуватися символом нового рядка (ASCII-рядок). Текстові редактори можуть впоратися з файлами, які є всіма текстами для друку, але не мають зворотного нового рядка.
busyboxs viтощо).
EOF - це не характер. Це стан, який вказує, що більше не може читати символів з потоку файлів. Коли ви вводите команду EOF з терміналу, ви сигналізуєте ОС закрити вхідний потік, не вводячи спеціального символу.
bashпотрапити на вхід, він масажується драйвером TTY. Цей драйвер перехоплює Ctrl-D і посилає EOF на адресу bash (де EOF - не персонаж, а особливий статус файлу)