Использование getline() в С++
У меня есть проблема с использованием метода getline для получения сообщения, которое пользователь вводит, я использую что-то вроде:
string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);
Однако он не останавливается, чтобы получить выходное значение, что с этим не так?
Ответы
Ответ 1
Если вы используете getline()
после cin >> something
, вам нужно сбросить символ новой строки из буфера между ними. Вы можете сделать это, используя cin.ignore()
.
Это будет примерно так:
string messageVar;
cout << "Type your message: ";
cin.ignore();
getline(cin, messageVar);
Это происходит потому, что оператор >>
оставляет символ новой строки \n
во входном буфере. Это может стать проблемой, когда вы выполняете неформатированный ввод, например getline()
, который считывает ввод до тех пор, пока не будет найден символ новой строки. Это произойдет, он немедленно перестанет читать, из-за этого \n
, который остался висящим там в вашей предыдущей операции.
Ответ 2
Если у вас есть только одна новая строка на входе, просто выполните
std::cin.ignore();
будет работать нормально. Он считывает и отбрасывает следующий символ из ввода.
Но если у вас есть что-то еще на входе, помимо новой строки (например, вы читаете одно слово, но пользователь вводит два слова), тогда вам нужно сделать
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
См. эта ссылка функции ignore
.
Чтобы быть еще более безопасным, сделайте вторую альтернативу выше в цикле до тех пор, пока gcount
не вернет нуль.
Ответ 3
У меня были похожие проблемы. Единственным недостатком является то, что с cin.ignore()
, вы должны нажать ввод еще 1 раз, что портит программу.
Ответ 4
int main(){
.... example with file
//input is a file
if(input.is_open()){
cin.ignore(1,'\n'); //it ignores everything after new line
cin.getline(buffer,255); // save it in buffer
input<<buffer; //save it in input(it a file)
input.close();
}
}
Ответ 5
Я думаю, что вы не приостанавливаете программу до ее окончания, поэтому вывод, который вы ставите после получения inpus, не отображается прямо на экране?
делать:
getchar();
до конца программы
Ответ 6
Код верный. Проблема должна лежать где-то в другом месте. Попробуйте минималистский пример из документации std:: getline.
main ()
{
std::string name;
std::cout << "Please, enter your full name: ";
std::getline (std::cin,name);
std::cout << "Hello, " << name << "!\n";
return 0;
}