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()) != EOF)
  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
4582
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
4582
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
4582
Ребята, давайте не путать ТС. EOF в C - константа всегда равная -1. Это значение возвращает getchar() и несколько других функций, обычно возвращающих очередной символ, и отмечает конец потока именно в этих функциях. Эта константа никак не связана со способом представления конца файла в ОС.

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

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



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

Сейчас этот форум просматривают: mihaild


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

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