【发布时间】:2018-11-25 15:23:48
【问题描述】:
我试图在使用 cin.getline() 5 次后重新读取 cin 缓冲区,方法是调用 cin.seekg(),但在再次调用 cin.getline() 之后,而不是从顶部,str 变为空字符串。 cin.getline() 是否刷新缓冲区?如果是这样,我该如何阻止这种情况发生?
#define PATH_MAX 512
using std::cin;
int main()
{
char* str = new char[PATH_MAX + 1];
for(int i = 0; i < 5; i++)
cin.getline(str, PATH_MAX);
cin.seekg(cin.beg);
while(true)
cin.getline(str, PATH_MAX);
return 0;
}
【问题讨论】:
-
seekg最终调用streambuf::seekpos:“此函数的基类版本无效。派生类可能会覆盖此函数以允许位置指示器的绝对定位。”像filebuf和stringbuf这样的类会覆盖它并做一些有用的事情,但cin没有使用其中之一。底线:你不能在cin上寻找。如果您想再次查看数据,请将其读取并存储在某处。 -
cin.seekg(cin.beg);不正确,它应该只是cin.seekg(0);,但很可能是std::cin根本不可搜索。没有要求它应该是。