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

Возможные Дубликаты:
нужна помощь с getline ()

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

#include<iostream>
using namespace std;

main()
{
string date,time;
char journal[23];


cout<<"Date:t";
cin>>date;
cout<<"Time:t";
cin>>time;

cout<<"Journal Entry:t";
cin.getline(journal,23);


cout<<endl;
system("pause");
}

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

cout<<"Journal Entry:t";
cin.getline(journal,23);
cout<<"Date:t";
cin>>date;
cout<<"Time:t";
cin>>time;

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

3 ответов


символы извлекаются до тех пор, пока либо (n - 1) символы не были извлеченный или разделяющий символ найден (который является delim, если это параметр указан, или' \n ' в противном случае). Добыча останавливается если во входной последовательности достигнут конец файла или произошла ошибка происходит во время операции ввода.

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

cout<<"Journal Entry:\t";
cin.ignore();
cin.getline(journal,23);

добавление к тому, что @DavidHammen сказал:

операции извлечения оставляют трейлинг '\n' символ в потоке. С другой стороны,--2--> отбрасывает его. Поэтому, когда вы звоните getline после того, как оператор добыче, '\n' это первый символ, он встречается и он перестает читать.

положите это после до getline извлечение вызова:

cin.ignore()

более надежный способ ввода будет что-то вроде это:

while (true) {

    cout<<"Time:\t";
    if (cin>>time) {
        cin.ignore();  // discard the trailing '\n'
        break;
    } else {
        // ignore everything or to the first '\n', whichever comes first
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cin.clear();  // clear the error flags
        cout << "Invalid input, try again.\n";
    }
}

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

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