Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Посимвольная обработка строки, не получается определить конец строки 
:(
    Опции темы
MarkSW
  Дата 25.4.2012, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.6.2010
Где: Калининград

Репутация: нет
Всего: нет



Здравствуйте.
Такая вот проблема:
нужно обработать посимвольно всю введённую пользователем строку и вывести её.
Все статьи, которые я только смог найти на эту темму, дружно предлагают что-то вроде этого:
Код

using namespace std;
int main(int argc, char *argv[]){
    char ch;
    while (!cin.fail()) {
          cin.get(ch);
          cout<<ch;      
    }
    return EXIT_SUCCESS;
}

или этого:
Код

using namespace std;
int main(int argc, char *argv[]){
    char ch;
    while (cin.get(ch)) cout<<ch;    
    return EXIT_SUCCESS;
}

Но у меня не происходит выхода из цикла: он повторяется снова и снова.
Я так понял, что когда считан последний символ из входного потока, то флаги fail() и EOF должны установиться в занчение "1", а у меня этого не происходит, у меня они всегда одинаковые (первый равен "0", а второй - "-1"). Или я чего-то не догоняю? smile Как мне завершить этот дурацкий цикл?
PM MAIL WWW ICQ MSN   Вверх
disputant
Дата 26.4.2012, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



Намек: пусть пользователь заканчивает ввод, нажав Ctrl-Z smile

Это не решение, а повод подумать, чем конец строки отличается от конца файла...
PM MAIL   Вверх
MarkSW
Дата 26.4.2012, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.6.2010
Где: Калининград

Репутация: нет
Всего: нет



Цитата

Намек: пусть пользователь заканчивает ввод, нажав Ctrl-Z 
Это не решение, а повод подумать, чем конец строки отличается от конца файла... 

 Не очень понял в чём намёк. Типа эти флаги работают только при чтении из файла?
А как тогда можно определить конец строки при чтении симоволов из входного потока, чтобы цикл просто сам завершился баз всяких Ctlr+Z?  smile 
PM MAIL WWW ICQ MSN   Вверх
disputant
Дата 26.4.2012, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



При чтении из любого потока.

Строка заканчивается символом '\n', так что, если уж категорически нельзя воспользоваться функцией getline(), проверяйте не только конец файла, но и конец строки.
PM MAIL   Вверх
MarkSW
Дата 26.4.2012, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.6.2010
Где: Калининград

Репутация: нет
Всего: нет



Цитата

Строка заканчивается символом '\n', так что, если уж категорически нельзя воспользоваться функцией getline(), проверяйте не только конец файла, но и конец строки.

так, с этим вроде разобрался, спасибо... чё-то я тупил: думал, что строка заканчивается символом '\0' и сравнивал с ним.
хотя, по сути '\0' там тоже присутсвует в конце строки, но почему проверка с ним не работает остаётся за гранью моего понимания.

а вот на счёт флагов я всё-равно ничерта не понял: вы говорите, что они работают при чтении из любого потока...
получается, что следующий код:
Код

using namespace std;
int main(int argc, char *argv[]){
    char ch;
    cin.get(ch);
    while (ch!='\n') {
        cout<<ch<<" - "<<cin.fail();
        cin.get(ch);
        cout<<endl;
    }    
    cout<<endl;
    return EXIT_SUCCESS;
}

должен после прочтения последнего символа выводить единицу, так как флаг, по идее, должен поменяться после прочтения буквы «d»:
Код

word
w - 0
o - 0
r - 0
d - 1

но у меня он тупо всегда равен нулю:
Код

word
w - 0
o - 0
r - 0
d - 0

а EOF всегда - «-1»!
???
PM MAIL WWW ICQ MSN   Вверх
disputant
Дата 26.4.2012, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



Вы же поток не закрываете... 
Введите что-то типа "abcd^Z" и посмотрите, что будет smile

^Z - Ctrl-Z. Вы под Windows работаете, кстати? В юниксах это, кажется, Ctrl-D, что ли... Словом, если вы закроете поток - файл ли это, или стандартный ввод, то после этого попытка считывания даст соответствующее значение в cin.fail(). А так - ну, ввели вы что-то, поток открыт, никаких сбоев... Вот fail() и ничего не докладывает smile
PM MAIL   Вверх
MarkSW
Дата 26.4.2012, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.6.2010
Где: Калининград

Репутация: нет
Всего: нет



ооо... Ctrl+Z закрывает поток! я этого не знал. Теперь многое начало проясняться.  smile 
Только C++ начал учить, пока чайник.
cin.fail() и cin.eof() заработали.
cin.good() - это, я так понял, противоположность cin.fail(),
а cin.bag() - хз smile
Единственное только с флагом EOF какая-то фигня, он всё-равно не меняется... всегда остаётся равным "-1". Или он не имеет ничего общего с вышеперечисленными флагами? Я-то думал, что cin.eof() как раз и меняет значение EOF, а по-ходу нет  smile 
PM MAIL WWW ICQ MSN   Вверх
disputant
Дата 26.4.2012, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



Цитата(MarkSW @ 26.4.2012,  12:32)
Я-то думал, что cin.eof() как раз и меняет значение EOF, а по-ходу нет  smile

EOF - это такое специальное значение, которое вы получаете, когда вы пытаетесь читать за концом файла!

Он вообще определен примерно как 

Код

#define EOF         (-1)


Например, именно так в Open Watcom и Visual Studio - и никак вы его не измените, это ж #define ("кто ж его посадит?! Он же ПАМЯТНИК!!!"  smile )

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.