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

Почему 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

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

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

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

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

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

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

getline() не работает, если используется после некоторых входов

getline() не работает, если я использую его после некоторых входов, т.е.

#include using namespace std; main() < string date,time; char journal[23]; cout>date; cout>time; cout

где, как если бы я использовал getline() поверх входов, он работает, т.е.

cout>date; cout>time; 

В чем может быть причина?

Поделиться Источник 02 октября 2012 в 13:33

3 ответа

Символы извлекаются до тех пор, пока не будут извлечены либо (n — 1) символы, либо не будет найден разделительный символ (что является разделителем, если указан этот параметр, либо ‘\n’ в противном случае). Извлечение также прекращается, если конец файла достигнут в последовательности ввода или если возникает ошибка во время операции ввода.

Когда cin.getline() читается из ввода, в потоке ввода остается символ новой строки, поэтому он не читает вашу строку c. Используйте cin.ignore() перед вызовом getline() .

cout 

Поделиться 02 октября 2012 в 13:44

Добавляя к тому, что сказал @DavidHammen:

Операции извлечения оставляют последующий символ '\n' в потоке. С другой стороны, istream::getline() отбрасывает его. Поэтому, когда вы вызываете getline после оператора извлечения, '\n' является первым символом, который встречается, и он перестает читать прямо там.

Поместите это после вызова getline извлечения:

Более надежный способ получения ввода будет выглядеть так:

while (true) < cout>time) < cin.ignore(); // discard the trailing '\n' break; >else < // ignore everything or to the first '\n', whichever comes first cin.ignore(numeric_limits::max(), '\n'); cin.clear(); // clear the error flags cout > 

Поделиться 02 октября 2012 в 13:45

Вы не проверяете состояние потока. Оператор извлечения потока std::cin ( operator>> ) может завершиться сбоем. Когда он завершится, поток помечается как "плохой" ( failbit , badbit или eofbit установлены). После "плохого" завершения все последующие извлечения потока в этом потоке завершатся сбоем, если вы не очистите состояние.

Учитесь быть параноидальным программистом. Всегда проверяйте состояние этих отформатированных операций ввода. Вы можете, например, выбросить исключение или напечатать сообщение об ошибке и выйти. Единственное, что вам не следует делать, это просто предположить, что это сработало.

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

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