cin.getline()从文件流中读取无法显示

ifstream is ("test.txt");
char ch[25];
int sz = 10;
char delim='\n';
while(is.getline(ch, sz, delim))
cout<//test.txt
nameisheljklk kgfgdsdfgbnhhd

whyidfsdfhjk
898fesf
c++ primer里给出描述是:
is.getline(sink,size,delim)
从 is 中读取最多 size 个字节,保存在字符数组sink中,起始地址由sink给出。 遇到字符 delim 或读取了 size 个字节或遇到文件尾时停止。如果遇到 delim,会读取并丢弃 delim。
问题:
无法输出ch,is.fail()是true,也就是没有进入循环,
这时需要修改 sz值或者修改截断字符:
只修改sz的值,则需要sz的值要大于等于行字符数+1;
修改截断字符(截断字符在行中间),则要满足sz大于等于截断字符之前的字符总数+1




```,但是只能输出一次截断之前的字符,后面的字符无法输出
这个原因是为什么?

该回答引用ChatGPT

这个问题很可能是由于输入流中仍然存在未读取的字符导致的。当 cin.getline() 在读取行时遇到截断字符时,它会停止读取,并将截断字符留在输入流中。如果后面的输入操作依然使用该输入流,则截断字符将成为该输入操作的第一个字符,因此后面的字符无法输出。

为了解决这个问题,您可以使用以下任一方法:

在使用 getline() 读取行之后,清空输入流中的截断字符。可以通过 is.ignore(numeric_limits::max(), '\n') 将输入流中的换行符读取并丢弃,从而清空输入流中的截断字符。

从输入流中读取整个行,而不是使用 getline() 读取部分行。您可以使用 is.getline() 或 getline(is, str) 读取整行并将其存储在字符串中。

下面是第一种方法的示例代码:



ifstream is("test.txt");
char ch[25];
int sz = 10;
char delim = '\n';
while (is.getline(ch, sz, delim))
{
    cout << ch << endl;
    is.ignore(numeric_limits<streamsize>::max(), '\n'); // 清空输入流中的截断字符
}

或者,您可以使用以下代码使用第二种方法:



ifstream is("test.txt");
string line;
while (getline(is, line))
{
    cout << line << endl;
}

请注意,在第二种方法中,您无需指定截断字符,因为 getline() 函数将读取整个行(直到遇到换行符)并将其存储在字符串中。