Reading two line continuously using getline function in c++

我与影子孤独终老i 提交于 2020-01-30 10:38:47

问题


I was learning how to read strings with getline function .I know that getline function read string as far as we dont hit enter or the size value in the getline parameter go cross . As far as i tried getline function to read one line of string i had not faced any problem. But when i was trying to read two line of string one after another in two different char array i got the output that was not expected to me. To understand my question follow bellow lines

#include <iostream>
using namespace std;
int main()
{
    char line1[10];
    char line2[10];
    cin.getline(line1,7);
    cin.getline(line2,7);
    cout << "\nline1 =" << line1 <<endl;
    cout << "line2 =" << line2 <<endl;
}

when i ran the above program it ask me for input then i gave orange as first input and hit the enter button.Next it ask me to give the second input .then i gave banana and hit the enter button .in this case it produce the result i expected .But if enter oranges for the first input it does not wait for me to enter the second input.As a result line1 store orange but line2 remains blank. Now my question is that there is no wrong with line1 storing orange .But i don't understand why the line2 remains blank should not it contain the data that remains after line1 take input i mean should not line2 contain s as value.Because orange is a 6 digit word so getline will stores the first six digit after then a null character will be added as i set the size of geline 7.then other remaing data will be assigend in the next call of getline function.So should not s stored in line2 as after s a new_line character is read for the first time .why will be line2 remain blank and why the screen doesn't stop for taking input after giving the first input.


回答1:


std::istream::getline is being overloaded with data.

According to cppreference,

Behaves as UnformattedInputFunction. After constructing and checking the sentry object, extracts characters from *this and stores them in successive locations of the array whose first element is pointed to by s, until any of the following occurs (tested in the order shown):

  • end of file condition occurs in the input sequence (in which case setstate(eofbit) is executed)
  • the next available character c is the delimiter, as determined by Traits::eq(c, delim). The delimiter is extracted (unlike basic_istream::get()) and counted towards gcount(), but is not stored.
  • count-1 characters have been extracted (in which case setstate(failbit) is executed).

Emphasis mine.

cin.getline(line1,7);
//                ^ This is count

can read only 6 characters with the 7th reserved for the null terminator. "oranges" is seven characters, and this places cin in a non-readable error state that must be cleared before reading can be continued. Reading of the second line

cin.getline(line2,7);

instantly fails and no data is read.

The obvious solution is

cin.getline(line1, sizeof(line1));

to take advantage of the whole array. But...

Any IO transaction should be tested for success, so

if (cin.getline(line1, sizeof(line1)))
{
    // continue gathering 
}
else
{
    // handle error
}

is a better option.

Better still would be to use std::getline and std::string to almost eliminate the size constraints.




回答2:


Adding to the great explanation of @user4581301, getline can receive 3 paramenters instead of the normal 2 used, the third parameter is a delimiter char istream& getline (istream& is, string& str, char delim);, by default the delimiter char is \n so it only stops reading charaters after it reaches the delimiter or one of the fail conditions is met, there are 3 error flags that can explain the function's behaviour, failbit, eofbit and badbit, I refer you to cplusplus for more info.



来源:https://stackoverflow.com/questions/57087499/reading-two-line-continuously-using-getline-function-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!