Eof си как ввести
Перейти к содержимому

Eof си как ввести

  • автор:

Условие !=EOF, что надо сделать чтобы оно было истинным

есть маленькая программа из книжки, внутри цикла условие, что нужно сделать, чтобы выйти из цикла и программа напечатала бы значение nc. Спасибо.

6 ответов

15 мая 2007 года
1.4K / / 24.07.2006

EOF — это End Of File. Поэтому юзать этот макрос надо при чтении файла, чего я у тебя не заметил. К тому же у тебя не определено значение nc, а ты его инкрементируешь. Напиши
int nc=0;
Если ты хочешь получить с клавиатуры значение, по которому можно из цикла выйти, то и впиши то, что с клавиатуры ввести можно. Например
while ((getchar())!=’e’)
Должно выполняться, пока не брякнешь на e

15 мая 2007 года
10 / / 12.05.2007

~ArchimeD~
спасибо за разъяснения
Почему же в книжке приводятся эти примеры, которые работают неправильно?
По поводу, любого символа с клавиатуры я догадался, было непонимание по поповоду EOF. Спасибо:)

15 мая 2007 года
1.4K / / 24.07.2006

Я так думаю че-то вроде какого-нибудь наброска. Типа как работает цикл. Или, че получится, если перенаправить ввод. А че за книжица то?

15 мая 2007 года
1.0K / / 08.01.2007

Так вообще не рекомендуется делать,есть такое правило «Всегда инициализируйте переменные».См.например Г.Саттер А.Александреску «Стандарты программирования на С++»,правило 19.А
в твоем коде — тем более.

Неинициализированные перемнные — распространенный источник ошибок в программах на С и С++.Избегайте их выработав привычку очищать память перед ее использованием , инициализируйте переменные при их определении.

// Не рекомендуется — не инициализирует переменную
int speedFactor;
if(condition)
speedFactor = 2;
else
speedFactor = -1;
// Лучше:инициализирует переменную
int speedFactor = -1;
if(condition)
speedFactor = 2;
// Еще лучше
int speedFactor = condition ? 2 : 1;

Eof си как ввести

Вопрос — как передать программе этот минуспервый EOF? Ctrl+Z не подходит, ибо при написании строки, нажатии Ctrl+Z, затем Enter, выдается либо пустая строка (продолжается чтение), либо, при вооде строки, нажатии Enter и вводе Ctrl+Z, далее Enter выдается бредовый результат.

Суть — как работать с EOF при вводе с консоли? Подскажите. Мучаюсь уже недели две.

Сообщ. #2 , 27.10.10, 17:22

строка заканчивается нажатием ENTER, поэтому лови «\n», т е:
while ((c = getchar()) != ‘\n’)

поскольку строка заканчивается комбинацией перехода на новую строку и возврата каретки(#10#13), то вроде даже так можно:

while ((c = getchar()) != 10)
Сообщение отредактировано: FasterHarder — 27.10.10, 17:25
Сообщ. #3 , 27.10.10, 17:41
Unregistered
Цитата FasterHarder @ 27.10.10, 17:22

строка заканчивается нажатием ENTER, поэтому лови «\n», т е:

while ((c = getchar()) != ‘\n’)

Не не не (С) =)
У K&R написан именно EOF. Хочу разобратсья именно с ним.

Цитата osmpavel @ 27.10.10, 17:20
Суть — как работать с EOF при вводе с консоли? Подскажите. Мучаюсь уже недели две.

P.S. Если изменим на ‘\n’ программа сможет работать только со строками. А если нужно вставить текст.
P.P.S. Все равно на выходе вместо количества цифр непонятный массив.

Сообщение отредактировано: osmpavel — 27.10.10, 17:51
Сообщ. #4 , 27.10.10, 17:57

Рейтинг (т): 268

Если ввести Ctrl-Z, то на нем и возвращается EOF.
То есть нормальные строки заканчиваются Enter. После каждой строки будет ‘\n’.
Под конец можно ввести какие-то символы, нажать Ctrl-Z и нажать Enter. Введутся набранные символы и после них EOF

FasterHarder, 10 это и есть ‘\n’. 13 — это ‘\r’. Символы в конце строки ты перепутал местами, хотя при выводе на принтер или экран в двоичном режиме результат выглядит одинаково.
Вот код 13 (вводится Ctrl+Enter) ловить не следует. При вводе в текстовом режиме пара ‘\r’/’\n’ заменяется на один ‘\n’.
Вообще не рекомендуется пользоваться числовым значением. Есть кодировки, в которых перевод строки кодируется по-другому.

Сообщ. #5 , 27.10.10, 18:13
Unregistered
Цитата amk @ 27.10.10, 17:57

Под конец можно ввести какие-то символы, нажать Ctrl-Z и нажать Enter. Введутся набранные символы и после них EOF

Попробуйте это исполнить. У меня корректного вывода не получилось.
Сообщ. #6 , 27.10.10, 18:23

amk, спасибо, понятно..
а еще по сабжу: EOF, это ведь вроде макрос, который по сути является там чем то. (-1 или Ctrl + Z или еще чего то).

Сообщ. #7 , 27.10.10, 18:28
Unregistered
Цитата FasterHarder @ 27.10.10, 18:23
EOF, это ведь вроде макрос

Ага. И описан он в stdio.h (указан его тип — int — и значение для конкретной платформы — (-1))
Сообщ. #8 , 27.10.10, 18:30

Цитата osmpavel @ 27.10.10, 18:28
И описан он в stdio.h (указан его тип — int — и значение для конкретной платформы — (-1))

ну тогда чисто логически не знаю, как ctrl + z может преобразоваться в (-1).
Сообщ. #9 , 27.10.10, 18:51
Unregistered

Вот тот же ответ в Usenet.

> 12.1b: I have a simple little program that reads characters until EOF,
> but how do I actually *enter* that «EOF» value from the
> keyboard?

> A: It turns out that the value of EOF as seen within your C program
> has essentially nothing to do with the keystroke combination you
> might use to signal end-of-file from the keyboard. Depending on
> your operating system, you indicate end-of-file from the
> keyboard using various keystroke combinations, usually either
> control-D or control-Z.

Как то все очень абстрактно. Не могу понять связи.

Сообщ. #10 , 27.10.10, 18:51
Unregistered
Цитата osmpavel @ 27.10.10, 18:13
Попробуйте это исполнить. У меня корректного вывода не получилось.

не ври, ты даже код не привел который тестил, все работает, видимо ты чтото не так делаешь:
std::cout << "Enter the string: "; char str[120]; while( std::cin >> str )
std::cout << str << std::endl; std::cout << "eof"; Прикреплённая картинка

Прикреплённая картинка

Добавлено 27.10.10, 18:52
Прога по Ctrl+Z выходит из цикла

Добавлено 27.10.10, 18:53
А, хотя я там протупил, код ты привел, это я его не заметил

Сообщ. #11 , 27.10.10, 18:58
Unregistered
Цитата KILLER @ 27.10.10, 18:51
не ври, ты даже код не привел который тестил
Цитата KILLER @ 27.10.10, 18:51
А, хотя я там протупил, код ты привел, это я его не заметил

Мда. Можно было бы пост свой подредактировать и высказываться менее категорично IMHO.

По теме: по Ctrl+Z она выходит, да, но для того, чтобы это произошло, нужно вставить Ctrl+Z на пустой строчке, т.е. если набрать что-то типа этого: «dhjjhet^Z» и нажать «Ввод», прога не поймет этого самого EOF, а курсор перейдет на следующую строчку. А нужно чтобы реакция была, как на прерывание, я так полагаю.

P.S. 2KILLER: у тебя код на С++. Я в нем, к сожалению, ничегошеньки не понимаю. =(
WBR

Сообщение отредактировано: osmpavel — 27.10.10, 19:04
Сообщ. #12 , 27.10.10, 19:04

Цитата osmpavel @ 27.10.10, 18:58
«dhjjhet^Z» и нажать «Ввод», прога не поймет этого самого EOF,

может потому что используешь буферизированную функцию getchar() (она без эхо печати еще). пока Enter не нажмешь, считывание из буфера не происходит..хотя не уверен что проблема именно в буферизации..

Сообщение отредактировано: FasterHarder — 27.10.10, 19:32
Сообщ. #13 , 27.10.10, 19:07

Цитата osmpavel @ 27.10.10, 19:05
Понял. Спасибо =)

погоди, погоди , я исправил пост выше..

Добавлено 27.10.10, 19:12
ради примера затестил такую прожку:

#include «stdafx.h»
while(ch != EOF)

// printf(«%d «, ch); если снять комменты, то на экране можно будет видеть КОДЫ нажатых клавиш. Удобно.

и в отладчике посмотрел, оказалось, нажатие Ctrl + Z вводит код 26 (непечатаемый символ)..если EOF равен -1, то понятно, что данная программа никогда не завершиться.

N.B. про расширенные коды тоже забывать не стоит.

Добавлено 27.10.10, 19:21

Цитата amk @ 27.10.10, 17:57
Если ввести Ctrl-Z, то на нем и возвращается EOF.

P.S. проверил EOF, да точно -1!

printВвод-вывод

printВвод

Для ввода используются следующие функции:

для char|для wchar_t|Назначение
—|—|—
«getchar()« `->` «int«|«getwchar()« `->` «wint_t«|Ввод одного символа. Возвращает код введенного символа или EOF (конец файла)
«scanf(fmt. )« `->` «int«|«wscanf(wfmt. )« `->` «int«|Форматированный ввод. Возвращает количество успешно введенных значений или EOF (конец файла)

Код символа принимает значение от 0 до 255 (буква ‘я’). Значение константы EOF равно `-1`. При сохранении результата в char невозможно отличить ввод буквы ‘я’ от конца файла.
Пример ввода по одному символу:

Проверьте, какой результат возвращает getchar в этом примере для пустых входных данных. Измените тип переменных a,b на char и введите символ ‘я’.

Для имитации конца файла в консоли в Windows нужно нажать Ctrl-Z, затем Enter, в Linux — Ctrl-D.

Для функции «scanf« первым аргументом нужно указать строку, содержащую спецификаторы формата — по одному для каждого следующего аргумента. Перед переменными в списке аргументов, в которые будут помещены введенные значения, должна быть указана операция «&« (получение адреса), кроме аргументов, соответствующих строкам.

В спецификаторе формата после % можно указать:
* символ «*«, который означает, что значение по этому формату будет введено, но не будет помещаться в очередной аргумент;
* максимальное количество символов, вводимых по указанному спецификатору.

— Все непробельные символы в формате интерпретируются как обязательные символы, присутствующие во вводе. При несовпадении очередного вводимого символа и символа в формате выполнение ввода завершается с ошибкой.
— Пробельные символы в формате приводят к пропуску последовательности пробельных символов во вводе. Ввод будет продолжен с первого непробельного символа. К пробельным символам относятся ‘ ‘,’\t’ и ‘\n’.
— Все спецификаторы формата, кроме «%с« и «%[«набор«]« пропускают пробельные символы перед началом ввода. Ввод завершается при обнаружении первого символа, не соответствующего спецификатору, или при достижении ограничения на количество символов. Если ни одного символа, соответствующего спецификации не было введено, выполнение ввода завершается с ошибкой.

Спецификатор %s означает ввод непустой последовательности непробельных символов.

Пример ввода с ограничением количества символов.

Пример пропуска символов при вводе даты в формате d/m/y:

Пример пропуска пробельных символов при ввода числа:
«`run-c
#include
int main()
< int k,r;
char c;
r=scanf(«%d%c»,&k,&c);
printf(«r=%d k=%d c=%d\n»,r,k,c);
>
10a
«`

Проверьте, какой результат возвращает scanf в этих примерах для неправильных и пустых входных данных.

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

Вот занялся нормальным изучением языка си, естественно воспользовался классикой Керниган, Ричи. Трудность понимания возникла в начале при чтении главы про «символическую константу EOF». Там говорят, что она обозначает конец входного потока ну и приведен текст программы где она используется:

Используется синтаксис C
while ( ( c = getchar ( ) ) != EOF )
putchar ( c ) ;

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

Re: Смысл EOF в си
14.07.2012, 21:45

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

Re: Смысл EOF в си
14.07.2012, 23:04

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

Re: Смысл EOF в си
14.07.2012, 23:18
Dosaev в сообщении #595304 писал(а):
[syntax lang=»c»]#include
.
[/syntax]

Dosaev , при включении кода в текст сообщения используется что-нибудь одно: или [cоde], или [syntаx]. Лучше [syntаx], причем для облегчения последующих ссылок на код — с атрибутом lines=n (для нумерации строк). Поправил.

Re: Смысл EOF в си
14.07.2012, 23:18

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

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

Re: Смысл EOF в си
14.07.2012, 23:19

Последний раз редактировалось Pavia 14.07.2012, 23:21, всего редактировалось 1 раз.

Цитата:

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

Вот что написано в википедии.

Цитата:

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

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

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

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

Представление ввода вывода в виде файлов удобно для реализации перенаправления ввода/вывода. К примеру в дос можно написать в терминале «test.exe По идеи если написать «test.exe

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *