2014 dxdy logo

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

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




Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней. На страницу 1, 2, 3  След.
 
 Смысл EOF в си
Сообщение14.07.2012, 21:16 
Аватара пользователя


26/02/11
332
Вот занялся нормальным изучением языка си, естественно воспользовался классикой Керниган, Ричи. Трудность понимания возникла в начале при чтении главы про "символическую константу EOF". Там говорят, что она обозначает конец входного потока ну и приведен текст программы где она используется:
Используется синтаксис C
  1. #include <stdio.h>
  2.  
  3. main()
  4. {
  5.     int c;
  6.    
  7.     while ((c = getchar()) != <span class="posthilit">EOF</span>)
  8.           putchar(c);
  9. }

Так вот, здесь я так понимаю входной поток - это данные(символы), введенные с клавиатуры.Тогда что принимать за конец входного потока? Я же могу бесконечно набирать текст с клавиатуры (насколько позволяет память), как функция getch() определит эту константу и когда?

 Профиль  
                  
 
 Re: Смысл EOF в си
Сообщение14.07.2012, 21:45 


03/05/12
56
Я тоже недавно читал/компилял. В винде программа выдаёт результат после нажатия ctrl+c, т.е. после прерывания её работы.

 Профиль  
                  
 
 Re: Смысл EOF в си
Сообщение14.07.2012, 23:04 
Аватара пользователя


26/02/11
332
А, то есть нажатием комбинации клавиш ctrl+c мы передаем системе значение EOF. Правильно? Ну пока как-то не особо ясно для чего нужна эта константа. Там даже было задание: написать программу, выводящую значение EOF, я написал, скомпилил, в результате вывелся пробел... :?

 Профиль  
                  
 
 Re: Смысл EOF в си
Сообщение14.07.2012, 23:18 
Админ форума
Аватара пользователя


19/03/10
8952
Dosaev в сообщении #595304 писал(а):
Код:
[syntax lang="c"]#include <stdio.h>
...
[/syntax]
Dosaev, при включении кода в текст сообщения используется что-нибудь одно: или [cоde], или [syntаx]. Лучше [syntаx], причем для облегчения последующих ссылок на код - с атрибутом lines=n (для нумерации строк). Поправил.

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


09/09/10
3729
Вообще-то EOF вводится по Ctrl+D (UNIX) / Ctrl+Z (Win). Ctrl+C — это прерывание работы программы.

Зачем эта константа нужна? Чтобы отследить, когда поток ввода закончится. Так всегда было: чтобы ввести простенький текст в файл с консоли, достаточно скомандовать "copy con 1.txt", ввести текст и нажать Ctrl+Z...

 Профиль  
                  
 
 Re: Смысл EOF в си
Сообщение14.07.2012, 23:19 
Аватара пользователя


31/10/08
1244
Цитата:
Тогда что принимать за конец входного потока? Я же могу бесконечно набирать текст с клавиатуры (насколько позволяет память), как функция getch() определит эту константу и когда?


Вот что написано в википедии.
Цитата:
Для указания терминалу в UNIX "EOF" следует воспользоваться комбинацией клавиш Ctrl+D. В Windows - Ctrl+Z.


На самом деле всё сложнее. EOF не является символом.
getch() По примеру большинства функций возвращает -1 когда происходит внутренняя ошибка. Такой ошибкой является конец файла. Закрытие файла.

Всё является файлом. Так вот консольный/терминальный ввод и вывод обычно на более низком уровне представим как файлы с хэндалами 0 и 1.
getch попросту читает данные из файла и как только обнаруживает что файл закрыт то выдает код ошибки -1=EOF.

Техническая реализация зависит от ОС. Но скорее всего ОС является POSIX совместимой.

Представление ввода вывода в виде файлов удобно для реализации перенаправления ввода/вывода. К примеру в дос можно написать в терминале "test.exe <<1.txt"
По идеи если написать "test.exe <1.txt<2.txt" то вы получите два EOF.

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


04/05/09
4587
Pavia в сообщении #595332 писал(а):
К примеру в дос можно написать в терминале "test.exe <<1.txt"
Нельзя. Можно один уголок: "test.exe <1.txt".

Pavia в сообщении #595332 писал(а):
По идеи если написать "test.exe <1.txt<2.txt" то вы получите два EOF.
Не получите. Прочитается только последний файл.

 Профиль  
                  
 
 Re: Смысл EOF в си
Сообщение15.07.2012, 00:35 


03/05/12
56
lim(f(x)) в сообщении #595308 писал(а):
Я тоже недавно читал/компилял. В винде программа выдаёт результат после нажатия ctrl+c, т.е. после прерывания её работы.

Это показалось мне странным. Мы вводим символы (выполняется функция getchar() ), потом прерываем работу программы, и всё же видим результат её работы (то есть следующая функция выполняется).

 Профиль  
                  
 
 Re: Смысл EOF в си
Сообщение15.07.2012, 13:24 
Аватара пользователя


22/12/10
264
Технически, приведённый код устарел. Когда-то для обозначения конца текстового файла действительно использовался символ EOF (причем не на всех платформах, и на разных платформах это был разный символ). Сейчас такая проверка обязана работать только для ввода с терминала, когда ввод завершается нажатием Ctrl-D/Ctrl-Z. Надежнее использовать функцию feof(3).

 Профиль  
                  
 
 Re: Смысл EOF в си
Сообщение15.07.2012, 16:36 
Аватара пользователя


31/10/08
1244
Цитата:
Когда-то для обозначения конца текстового файла действительно использовался символ EOF (причем не на всех платформах, и на разных платформах это был разный символ).

Хотелось бы увидеть ссылку с доказательством.

 Профиль  
                  
 
 Re: Смысл EOF в си
Сообщение15.07.2012, 16:50 
Заслуженный участник


04/05/09
4587
Portnov в сообщении #595505 писал(а):
Технически, приведённый код устарел. Когда-то для обозначения конца текстового файла действительно использовался символ EOF (причем не на всех платформах, и на разных платформах это был разный символ). Сейчас такая проверка обязана работать только для ввода с терминала, когда ввод завершается нажатием Ctrl-D/Ctrl-Z. Надежнее использовать функцию feof(3).
1.
Код не устарел.
2.
EOF - не символ, а число (-1), не пересекающееся с реально прочитанными символами, возвращаемыми из getchar() (0...255). Одна из распространённых ошибок - сохранять результат getchar() в переменную типа char. В результате, если char - signed, то чтение остановится и на символе с кодом 255 (буква 'я' в виндовой кодировке), а если unsigned, то получится бесконечный цикл.
3.
Работает для любых файлов.

 Профиль  
                  
 
 Re: Смысл EOF в си
Сообщение15.07.2012, 23:27 
Аватара пользователя


26/02/11
332
Какие-то разногласия пошли, может и не столь большие, но все же... Пока только для себя выяснил, что если вводить символы, потом ctrl-z, а потом снова символы, то результатом выполнения программы будут все символы до ввода ctrl-z, оно и понятно, ведь цикл прервался после считывания EOF функцией getchar(). Ну а общее предназначение EOF все равно как-то далеко от меня... :-(

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


30/01/06
72407
Pavia в сообщении #595574 писал(а):
Хотелось бы увидеть ссылку с доказательством.

http://en.wikipedia.org/wiki/ASCII#ASCI ... characters (последний абзац раздела перед таблицей)
Про другие платформы http://en.wikipedia.org/wiki/End-of-file (последний абзац)

 Профиль  
                  
 
 Re: Смысл EOF в си
Сообщение16.07.2012, 06:15 
Аватара пользователя


22/12/10
264
EOF как символ (например, Ctrl-D) имеет смысл при чтении данных из источника, в котором нет «естественного» конца. Например, с клавиатуры. Как определить, что ввод с клавиатуры закончен? Может, пользователь просто задумался? Так что нужен какой-то сигнал «Конец ввода». Та же история при чтении данных, например, из COM-порта или из сетевого сокета. Там, правда, и другие методы определения конца данных используются.

 Профиль  
                  
 
 Re: Смысл EOF в си
Сообщение16.07.2012, 06:52 
Заслуженный участник


04/05/09
4587
Ребята, давайте не путать ТС. EOF в C - константа всегда равная -1. Это значение возвращает getchar() и несколько других функций, обычно возвращающих очередной символ, и отмечает конец потока именно в этих функциях. Эта константа никак не связана со способом представления конца файла в ОС.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 43 ]  На страницу 1, 2, 3  След.

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



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

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


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

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