Почему getline не работает после cin c
Перейти к содержимому

Почему getline не работает после cin c

  • автор:

Странно работает cin.get

Он почему-то не работает после того, как я делаю «cin >> чтототам», без этого все работает, а как только сделаю «cin >> чтототам», cin.get просто не работает 🙁 что делать ?

anonymous
05.05.01 12:46:38 MSD

Re: Странно работает cin.get

а можно подробности узнать, как именно не работает? желательно куском кода 🙂

anonymous
( 06.05.01 04:31:58 MSD )

Re: Странно работает cin.get

Куском кода давать проблематично т.к. я не умею делать переход на новую строку в этом форуме(пытался писать
— не получилось). Я пытаюсь делать примерно так : int age; char name[20]; Потом делаю cin >> age; Это работает и работает так как надо, а потом я делаю cin.get(name, 20); — вот это уже не работает, просто не делается приглашения ввести что-то. Похоже cin >> age; забирает все до пробела, а cin.get — подбирает все, что после него, а мне надо чтобы cin.get забирал свою, независимую от cin >> строку. Получилось сделать так, между cin >> и cin.get вставить char garbage; garbage = cin.get(); — так все нормально, но мне кажется как то неправильно это.

anonymous
( 06.05.01 17:24:21 MSD )

Re: Странно работает cin.get

не понял как не работает. у меня все работает:

int main(void) <
int age;
char name[20];
string str;

или я не понял чего именно ты хочешь?
заглотить целую строчку? тогда пользуй
istream& istream::getline(char* ptr, int len, char delim = ‘\n’);
соответственно cin.getline(name,20);

в общем пиши, разберемся 🙂

PS. а по поводу переносов, есть такой listbox под окошком,
ставишь там User line breaks 🙂

anonymous
( 07.05.01 00:42:53 MSD )

Re: Странно работает cin.get

Проверка
переноса
проверка

anonymous
( 07.05.01 00:54:54 MSD )

Re: Странно работает cin.get

Перенос работает — большое спасибо. Код не работает вот так:
#include
#include

age — он забирает, а вот fio — нет 🙁

anonymous
( 07.05.01 01:01:19 MSD )

Re: Странно работает cin.get

в общем мораль простая, cin >> age оставляет конец строки
в потоке, в результате по getline тебе прилетает пустая строчка
пока чтоб работало можешь сделать что-нить вроде:
#include
#include

void main(void) <
int age;
char fio[20],tmp;
cin >> age;
cin >> tmp;
cin.putback(tmp);
cin.getline(fio,20);
cout >

это работает, потому как все пробельные символы пропускаются пока
не найдется не-пробел, он кладется в tmp и потом запихивается
обратно в поток.
ну или если пустая строчка то перечитывай пока непустая не придет 🙂

хотя по-моему был какой-то прямой способ сказать
istream чтоб пропустил пробелы перед началом считывания.

утро вечера мудренее, завтра поковыряюсь — напишу

PS. подумай про случай, когда тебе введут `21 Joe Farmer’ 🙂
PPS. почему предпочитаешь char* использовать, когда есть string ?

anonymous
( 07.05.01 03:41:58 MSD )

Re: Странно работает cin.get

Спасибо, я в общем то так и делал, только чуть-чуть по другому:
char garbage;
garbage = cin.get();

cin.get без параметров возвращает единичный символ, похоже то что мне надо, тот самый разделитель, я потому и написал, что думал про другой способ, более правильный. Про тот случай когда вводятся данные целиком подумал, спасибо. String не использую потому, что сейчас пытаюсь разобраться с поизвольным доступом к файлу, записываю туда структуру целиком, и мне нужно чтобы были четкие размеры, а string я не вообще не особо понимаю — какие у него размеры 🙂 В общем большое спасибо, если найдешь другой способ — напиши пожалуйста.

anonymous
( 07.05.01 19:23:14 MSD )

Re: Странно работает cin.get

Структуру лучше записывать методом write, а считывать методом read. Пропускать пробелы — если я правильно помню — cin >> skipws.

justme ★
( 08.05.01 02:48:46 MSD )

Re: Странно работает cin.get

про структуры и бинарные файлы согласен с justme

про skipws все почти так, skipws в установленном сстоянии
обеспечивает пропуск пробельных символов при вводе(сам он их не извлекает)
перед данными при операциях вроде
cin >> age;
getline, get не пропускает пробелы перед вводом данных. отличаются
они тем, что getline забирает конец строчки из потока, а get — нет.

char garbage=cin.get();
работает только если после age не осталось пробелов до конца строки.
я-бы не стал на это надеяться, особенно если учесть возможность
перенаправления ввода из файла.

char tmp;
cin >> tmp;
cin.putback(tmp);
работает потому, что по-умолчанию в потоке стоит флажок skipws и все
пробелы пробелы пропускаются, в tmp кладется первый не пробел из следующей
строчки(fio), он запихивается обратно в поток и первый символ — начало
строчки. все работает, если устраивает игнорирование пробелов вначале fio.

и использовать примерно так:
char fio[20];
int age;
cin >> age;
skipwhite(cin);
cin.readline(fio,20);

или при большом желании можно сделать из нее манипулятор,
как писать пока не буду, надо будет — напишу 🙂
char fio[20];
int age;
cin >> age >> skipwhite;
cin.readline(fio,20);

надеюсь на этот раз ровно то, что хотелось 🙂
ds.

PS. DOS’овские CR/LF это, как обычно, дополнительные грабли, но имхо
лучше с ними не связаваться, а конвертить предварительно файлы.

PPS. все равно не пойму, чем тебе больше нравится
char fio[20];
cin.getline(fio,20);
чем
string fio;
cin.getline(fio);
по-моему ничем не хуже 🙂 а лучше,
а если структуры/бинарные данные вводить, то правильней использовать
read и write, они хоть char(0) в конец не добавляют, и читают
указанные 20 символов, а не 19, как get и getline 🙂

Почему getline не работает после cin c

т.е.определить p по некоторой формуле то все нормально работает.
Вопрос, как сделать так чтобы после ручнного ввода числа, cin.getline работал?
вся программа (шифрования цезаря с ключом) приведена ниже

cin. getline (q,2);
p=q[0]- ‘0’ ;

//определение позиции начала записи ключа

// for (i=0; i // // if (key[0]==Alfa[i])
// >

//записываем ключ в новый массив
for (i=p, j=0; i beta[i]=key[j];
>

//заполнение шифрованного масива остальными буквами после конца ключа
for (i=p+k, j=0; i for (z=0; z if (Alfa[j]==key[z])
beta[i]=Alfa[j];
>

//заполнение шифрованного массива перед началом ключа
for (i=0, j=j-1; i for (z=0; z if (Alfa[j]==key[z])
beta[i]=Alfa[j];
>

cin. getline (A,1000);

автор: shtirlitz (15.11.2008 в 11:59) письмо автору

проблема решена,
спасибо за внимание,
если у кого, такая же проблема, то перед строкой, где не срабатывает cin.getline
вставьте следующий код:

cin. ignore ();

и будет вам счастье!

автор: AlMag (15.11.2008 в 23:08) письмо автору

спасибо за информацю

автор: StarWorm (17.11.2008 в 03:07) письмо автору

Ого. Спасибо! 🙂
А то я недавно как раз долго не знал что и предпринять. Весь инет облазил, но так и не понял!
Проблема была в том, что после

cin>>variable

у меня не работала

cin. getline (str,255)

Хотя то же самое происходило и со

scanf (. )

если после него было что то наподобие

gets (. )

Но если их поменять местами, то все работало нормально.
Теперь все решено! Еще раз спасибо! xD RESPECT

Не работает cin.getline

Не работает cin.getline(name2, 3). Компилятор его тупо пропускает.

Добавлено через 4 минуты
первый cin.getline(name,3); работает нормально

Лучшие ответы ( 3 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

cin.getline как работает?
Здравствуйте, в моей программе я столкнулся с некоторой проблемой. В переменную place я хочу.

Не работает cin.getline(buf, 20);
Товарищи подскажите почему не работает cin.getline(buf, 20);? Проблема в том что я хочу ограничить.

Не работает. cin.getline(string,200);
Я создаю проект. Все работает кроме одного cin.getline(string,200), почему? Когда запускаю этот.

167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596

Лучший ответ

Сообщение было отмечено FGlomgold как решение

Решение

ЦитатаСообщение от FGlomgold Посмотреть сообщение

Компилятор его тупо пропускает.

Нет. Просто после первого getline в буфере ввода остаётся символ конца строки, поэтому второй сразу завершается.
Попробуйте, например, ввести сразу 6 символов — и Вы увидете, что оба оператора отработали.

Почему после использования cin функции cin.get() и cin.getline() не работают, а последующие вызовы cin срабатывают?

Насколько я знаю cin оставляет символ ‘\n’ в потоке из-за чего последующие вызовы cin.get() и cin.getline() не будут срабатывать, поскольку они будут натыкаться на символ перевода строки и завершать свою работу. Для того, чтобы функции cin.get() и cin.getline() успешно работали после cin >> нужно «выбросить» ‘\n’ из потока при помощи cin.get() или cin.ignore(numeric_limits::max(), ‘\n’) .

Вопрос: почему cin будет работать и без «очищения» потока от символа ‘\n’?

Т.е. я имею в виду, что этот код будет работать без cin.get() или cin.ignore():

 char str1[80], str2[80]; cin >> str1; cin >> str2; 

А этот нет:

 char str1[80], str2[80]; cin >> str1; cin.getline(str2, 80); 

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

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