c++ – getline() does not work if used after some inputs

c++ – getline() does not work if used after some inputs

Characters are extracted until either (n – 1) characters have been
extracted or the delimiting character is found (which is delimiter if this
parameter is specified, or n otherwise). The extraction also stops
if the end of the file is reached in the input sequence or if an error
occurs during the input operation.

When cin.getline() reads from the input, there is a newline character left in the input stream, so it doesnt read your c-string. Use cin.ignore() before calling getline().

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

Adding to what @DavidHammen said:

The extraction operations leave the trailing n character in the stream. On the other hand, istream::getline() discards it. So when you call getline after an extraction operator, n is the first character it encounters and it stops reading right there.

Put this after before getline call extraction:

cin.ignore()

A more robust way of taking input would be something like this:

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;
    }
}

c++ – getline() does not work if used after some inputs

Youre not checking stream status. The std::cin stream extraction operator (operator>>) can fail. When it does, the stream is marked as bad (failbit, badbit, or eofbit are set). Once bad, all subsequent stream extractions on that stream will fail unless you clear the status.

Learn to be a paranoid programmer. Always check status of those formatted input operations. You could, for example throw an exception, or print an error message and exit. The one thing you shouldnt do is to simply assume that it worked.

Leave a Reply

Your email address will not be published.