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

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

  • автор:

Почему после использования 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); 

Не работает getline в case

Здраствуйте, у меня проблема с оператором getline в case — он попросту пропускается когда надо вводить текст . уже второй день над етим бьюсь и ничего сделать немогу .

switch(opt) <
case 1:
<
std::string text;
std::getline(std::cin, text);
for(int i = 0; (unsigned int)i < text.size(); i++) <
if((char)text != ‘ ‘) <
std::cout > else <
std::cout >
>
std::cout >
break;
case 2:
<
std::ifstream inputfile;
inputfile.open(«forencode.txt»);
if(inputfile.is_open()) <
std::string text;
std::getline(inputfile, text);
inputfile.close();
std::ofstream outputfile;
outputfile.open(«encoded.txt»);
if(outputfile.is_open()) <
for(unsigned long int i = 0; (unsigned int)i < text.size(); i++) <
outputfile >
outputfile.close();
> else <
exit(EXIT_FAILURE);
>
> else <
exit(EXIT_FAILURE);
>
>
break;
default:
<
std::cout exit(EXIT_FAILURE);
>
>

Может вы подскажите с чем проблема?

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

Начал недавно изучать C++. В данном примере не могу понять почему не работает cin.getline. Если мы его выносим из switch то все работает хорошо.

using std::cout;
using std::cin;
using std::endl;

int main()
setlocale(0, «»);
int s;
bool p = true;
char a[10];

Сергей_Якутин
Посмотреть профиль
Найти ещё сообщения от Сергей_Якутин
Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с cin.getline(); Nullerset Общие вопросы C/C++ 1 21.10.2013 00:29
string, cin.getline() не понимаю. Arantir# Помощь студентам 4 01.12.2012 16:01
cin.getline и gets() iceman2112 Общие вопросы C/C++ 3 14.11.2012 14:33
cin.getline Intess Общие вопросы C/C++ 1 20.03.2012 15:22
C++ cin.getline. Исправьте ошибку Jane-sad Помощь студентам 0 18.02.2011 15:46

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

Проблема в следующем:
заношу данные в переменную с помощью оператора >>
Но потом в цикле при вызове функции getline она при первом вызове не работает вообще, тоесть при отладке компилятор даже не передает управление программе, чтобы я ввел число
П.С. Когда-то эту проблему решал вызов какой-то функции перед вызовом getline, но эту функцию я забыл

Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933

cin.ignore(); // or cin.sync(); // перед getline

Форумчанин
Регистрация: 10.10.2009
Сообщений: 680
Сообщение от AxenicX

Проблема в следующем:
заношу данные в переменную с помощью оператора >>
Но потом в цикле при вызове функции getline она при первом вызове не работает вообще, тоесть при отладке компилятор даже не передает управление программе, чтобы я ввел число
П.С. Когда-то эту проблему решал вызов какой-то функции перед вызовом getline, но эту функцию я забыл

Не знаю, правильно ли я понял, в чем проблема. Если да, то есть такой вариант: после считывания переменной мы ведь остаемся в той же строке, где была переменная. Если надо считать полностью следующую строку, то проблемка есть, теоретически считывается «getline» до конца текущая строка. Поэтому первый getline работает нестандартно — он считывает до конца строку, в которой мы были и перенос на следующую строку (даже если в текущей мы уже вконце, в следующую мы ведь еще не попали). Можно дописать лишний getline перед циклом и должно заработать.

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

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