2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Немного о EOF
Сообщение07.01.2013, 23:45 
Заслуженный участник
Аватара пользователя


28/07/09
1238
У Кернигана, Ритчи утверждается (с. 30), что данный код
  1. #include <stdio.h> 
  2. main() 
  3. int c; 
  4. while((c=getchar())!=EOF) putchar(c);  

копирует входной поток в выходной и, цитирую, "когда достигается конец потока, цикл, а вместе с ним и функция main(), прекращают работу"

У меня эта программа работает не так, как хочется мне. А замысел авторов я не знаю.

У меня получается, что программа прекращает работу, только если в потоке символов встречается сочетание "EOF, EOF" или "\n, EOF". Одиночные же "\n" и "EOF" работают примерно одинаково. Они не прерывают цикл while, а лишь скармливают getchar'у очередную порцию символов с клавиатуры, после чего курсор снова мигает и ждёт от меня новых символов. Только в первом случае курсор переносится на новую строку, а во втором нет. Поясню на примере.

Введены символы t,e,s,t. Я печатаю символ "\n" (нажимаю Enter) (Это ведь одно и то же, да?), программа на новой строке пишет test, после чего ждёт от меня очередной порции символов. Если я напечатаю символ "EOF" (нажимаю Ctrl+D), то программа на этой же строке пишет test, после чего ждёт новых символов. А вот если в любом из двух вариантов опять нажать Ctrl+D, то программа таки завершается. Так и должно быть? Почему после первого ввода условие while игнорируется?
P.S. gcc версия 4.6.3.

 Профиль  
                  
 
 Re: Немного о EOF
Сообщение07.01.2013, 23:56 
Заслуженный участник


27/04/09
28128
Может быть, эта цитата будет к месту:

In Unix the end-of-file character (by default EOT) causes the terminal driver to make available all characters in its input buffer immediately; normally the driver would collect characters until it sees an end-of-line character. If the input buffer is empty (because no characters have been typed since the last end-of-line or end-of-file), a program reading from the terminal reads a count of zero bytes. In Unix, such a condition is understood as having reached the end of the file.

This can be demonstrated with the cat program on Unix-based operating systems such as Linux: Run the cat command with no arguments, so it accepts its input from the keyboard and prints output to the screen. Type a few characters without pressing Enter, then type Ctrl+D. The characters typed to that point are sent to cat, which then writes them to the screen. If Ctrl+D is typed without typing any characters first, the input stream is terminated and the program ends. An actual EOT is obtained by typing Ctrl+V then Ctrl+D.

If the terminal driver is in raw mode it no longer interprets control characters, and the EOT character is sent unchanged to the program, which is free to interpret it any way it likes. A program may then decide to handle the EOT byte as an indication that it should end the text, this would then be similar to how Ctrl+Z is handled by DOS programs.

 Профиль  
                  
 
 Re: Немного о EOF
Сообщение07.01.2013, 23:59 
Заслуженный участник


04/05/09
4587
Почитайте ещё эту тему.

 Профиль  
                  
 
 Re: Немного о EOF
Сообщение08.01.2013, 00:54 
Заслуженный участник
Аватара пользователя


28/07/09
1238
arseniiv
Больше спасибо. В принципе, всю информацию я уже сам выяснил опытным путём, о чём и рассказал в первом сообщении :D
Получается, что у этого символа в Unix есть две функции:
1) Будучи введенным после ненулевого количества символов, отличных от него и EOL, просто отправляет программе символы из буфера. Действует точно так же, как и клавиша Enter (ввод+перенос курсора), только не переносит курсор. Только сейчас я осознал всю логику разделения win клавиши Enter на две в компьютерах Mac: Enter и Return.
2) Будучи введенным после другого EOT или EOL (буфер пуст), завершает считывание с файла.
По сути я только что переписал первый абзац вашей цитаты, но вдруг кто-нибудь нагуглит эту тему, а по-английски не ферштейн:)

 Профиль  
                  
 
 Re: Немного о EOF
Сообщение08.01.2013, 15:15 
Заслуженный участник


27/04/09
28128

(Оффтоп)

Legioner93 в сообщении #668663 писал(а):
Больше спасибо.
Было бы за что! :-)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group