| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Посимвольная обработка строки |
| Автор: MarkSW 25.4.2012, 23:36 | ||||
| Здравствуйте. Такая вот проблема: нужно обработать посимвольно всю введённую пользователем строку и вывести её. Все статьи, которые я только смог найти на эту темму, дружно предлагают что-то вроде этого:
или этого:
Но у меня не происходит выхода из цикла: он повторяется снова и снова. Я так понял, что когда считан последний символ из входного потока, то флаги fail() и EOF должны установиться в занчение "1", а у меня этого не происходит, у меня они всегда одинаковые (первый равен "0", а второй - "-1"). Или я чего-то не догоняю? |
| Автор: disputant 26.4.2012, 07:02 |
| Намек: пусть пользователь заканчивает ввод, нажав Ctrl-Z Это не решение, а повод подумать, чем конец строки отличается от конца файла... |
| Автор: MarkSW 26.4.2012, 07:59 | ||
Не очень понял в чём намёк. Типа эти флаги работают только при чтении из файла? А как тогда можно определить конец строки при чтении симоволов из входного потока, чтобы цикл просто сам завершился баз всяких Ctlr+Z? |
| Автор: disputant 26.4.2012, 09:09 |
| При чтении из любого потока. Строка заканчивается символом '\n', так что, если уж категорически нельзя воспользоваться функцией getline(), проверяйте не только конец файла, но и конец строки. |
| Автор: MarkSW 26.4.2012, 12:00 | ||||||||
так, с этим вроде разобрался, спасибо... чё-то я тупил: думал, что строка заканчивается символом '\0' и сравнивал с ним. хотя, по сути '\0' там тоже присутсвует в конце строки, но почему проверка с ним не работает остаётся за гранью моего понимания. а вот на счёт флагов я всё-равно ничерта не понял: вы говорите, что они работают при чтении из любого потока... получается, что следующий код:
должен после прочтения последнего символа выводить единицу, так как флаг, по идее, должен поменяться после прочтения буквы «d»:
но у меня он тупо всегда равен нулю:
а EOF всегда - «-1»! ??? |
| Автор: disputant 26.4.2012, 12:09 |
| Вы же поток не закрываете... Введите что-то типа "abcd^Z" и посмотрите, что будет ^Z - Ctrl-Z. Вы под Windows работаете, кстати? В юниксах это, кажется, Ctrl-D, что ли... Словом, если вы закроете поток - файл ли это, или стандартный ввод, то после этого попытка считывания даст соответствующее значение в cin.fail(). А так - ну, ввели вы что-то, поток открыт, никаких сбоев... Вот fail() и ничего не докладывает |
| Автор: MarkSW 26.4.2012, 12:32 |
| ооо... Ctrl+Z закрывает поток! я этого не знал. Теперь многое начало проясняться. Только C++ начал учить, пока чайник. cin.fail() и cin.eof() заработали. cin.good() - это, я так понял, противоположность cin.fail(), а cin.bag() - хз Единственное только с флагом EOF какая-то фигня, он всё-равно не меняется... всегда остаётся равным "-1". Или он не имеет ничего общего с вышеперечисленными флагами? Я-то думал, что cin.eof() как раз и меняет значение EOF, а по-ходу нет |
| Автор: disputant 26.4.2012, 15:06 | ||||
EOF - это такое специальное значение, которое вы получаете, когда вы пытаетесь читать за концом файла! Он вообще определен примерно как
Например, именно так в Open Watcom и Visual Studio - и никак вы его не измените, это ж #define ("кто ж его посадит?! Он же ПАМЯТНИК!!!" |