![]() |
|
Модераторы: bsa |
![]()
|
|
| MarkSW |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 25.6.2010 Где: Калининград Репутация: нет Всего: нет |
Здравствуйте.
Такая вот проблема: нужно обработать посимвольно всю введённую пользователем строку и вывести её. Все статьи, которые я только смог найти на эту темму, дружно предлагают что-то вроде этого:
или этого:
Но у меня не происходит выхода из цикла: он повторяется снова и снова. Я так понял, что когда считан последний символ из входного потока, то флаги fail() и EOF должны установиться в занчение "1", а у меня этого не происходит, у меня они всегда одинаковые (первый равен "0", а второй - "-1"). Или я чего-то не догоняю? |
||||
|
|||||
| disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Намек: пусть пользователь заканчивает ввод, нажав Ctrl-Z
Это не решение, а повод подумать, чем конец строки отличается от конца файла... |
|||
|
||||
| MarkSW |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 25.6.2010 Где: Калининград Репутация: нет Всего: нет |
Не очень понял в чём намёк. Типа эти флаги работают только при чтении из файла? А как тогда можно определить конец строки при чтении симоволов из входного потока, чтобы цикл просто сам завершился баз всяких Ctlr+Z? |
|||
|
||||
| disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
При чтении из любого потока.
Строка заканчивается символом '\n', так что, если уж категорически нельзя воспользоваться функцией getline(), проверяйте не только конец файла, но и конец строки. |
|||
|
||||
| MarkSW |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 25.6.2010 Где: Калининград Репутация: нет Всего: нет |
так, с этим вроде разобрался, спасибо... чё-то я тупил: думал, что строка заканчивается символом '\0' и сравнивал с ним. хотя, по сути '\0' там тоже присутсвует в конце строки, но почему проверка с ним не работает остаётся за гранью моего понимания. а вот на счёт флагов я всё-равно ничерта не понял: вы говорите, что они работают при чтении из любого потока... получается, что следующий код:
должен после прочтения последнего символа выводить единицу, так как флаг, по идее, должен поменяться после прочтения буквы «d»:
но у меня он тупо всегда равен нулю:
а EOF всегда - «-1»! ??? |
||||||||
|
|||||||||
| disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Вы же поток не закрываете...
Введите что-то типа "abcd^Z" и посмотрите, что будет ^Z - Ctrl-Z. Вы под Windows работаете, кстати? В юниксах это, кажется, Ctrl-D, что ли... Словом, если вы закроете поток - файл ли это, или стандартный ввод, то после этого попытка считывания даст соответствующее значение в cin.fail(). А так - ну, ввели вы что-то, поток открыт, никаких сбоев... Вот fail() и ничего не докладывает |
|||
|
||||
| MarkSW |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 25.6.2010 Где: Калининград Репутация: нет Всего: нет |
ооо... Ctrl+Z закрывает поток! я этого не знал. Теперь многое начало проясняться.
Только C++ начал учить, пока чайник. cin.fail() и cin.eof() заработали. cin.good() - это, я так понял, противоположность cin.fail(), а cin.bag() - хз Единственное только с флагом EOF какая-то фигня, он всё-равно не меняется... всегда остаётся равным "-1". Или он не имеет ничего общего с вышеперечисленными флагами? Я-то думал, что cin.eof() как раз и меняет значение EOF, а по-ходу нет |
|||
|
||||
| disputant |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
EOF - это такое специальное значение, которое вы получаете, когда вы пытаетесь читать за концом файла! Он вообще определен примерно как
Например, именно так в Open Watcom и Visual Studio - и никак вы его не измените, это ж #define ("кто ж его посадит?! Он же ПАМЯТНИК!!!" |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |