C++ 使用std::cin.getline()后如何保留std::cin的缓冲区

C++ 使用std::cin.getline()后如何保留std::cin的缓冲区,c++,std,cin,istream,C++,Std,Cin,Istream,在使用cin.getline()5次之后,我试图通过调用cin.seekg()来重新读取cin缓冲区,但是在再次调用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;

在使用cin.getline()5次之后,我试图通过调用cin.seekg()来重新读取cin缓冲区,但是在再次调用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;
}
#定义路径_max512
使用std::cin;
int main()
{
char*str=新字符[PATH_MAX+1];
对于(int i=0;i<5;i++)
cin.getline(str,PATH_MAX);
cin.seekg(cin.beg);
while(true)
cin.getline(str,PATH_MAX);
返回0;
}
使用
cin.getline()
5次后,我试图重新读取
cin
缓冲区

分别使用基于终端的输入,
cin
,这是不可能的

您可以自己跟踪读取的输入,使用
std::vector
将这些行保持在第一位。这是一个粗略的草图:

#include <iostream>
#include <string>
#include <vector>    
using std::cin;
using std::string;

int main()
{
    std::vector<string> lines;
    string line;
    for(int i = 0; i < 5; i++) {
        std::getline(cin,line);
        lines.push_back(line);
    }

    auto linepos = lines.begin();
    while(linepos != lines.end()) {
        // cin.getline(str, PATH_MAX); instead do:
        // process *linepos
        ++linepos;
    }
}
#包括
#包括
#包括
使用std::cin;
使用std::string;
int main()
{
std::矢量线;
弦线;
对于(int i=0;i<5;i++){
标准::getline(cin,line);
线。推回(线);
}
auto linepos=行。开始();
while(linepos!=lines.end()){
//cin.getline(str,PATH_MAX);改为:
//进程*linepos
++linepos;
}
}
使用
cin.getline()
5次后,我试图重新读取
cin
缓冲区

分别使用基于终端的输入,
cin
,这是不可能的

您可以自己跟踪读取的输入,使用
std::vector
将这些行保持在第一位。这是一个粗略的草图:

#include <iostream>
#include <string>
#include <vector>    
using std::cin;
using std::string;

int main()
{
    std::vector<string> lines;
    string line;
    for(int i = 0; i < 5; i++) {
        std::getline(cin,line);
        lines.push_back(line);
    }

    auto linepos = lines.begin();
    while(linepos != lines.end()) {
        // cin.getline(str, PATH_MAX); instead do:
        // process *linepos
        ++linepos;
    }
}
#包括
#包括
#包括
使用std::cin;
使用std::string;
int main()
{
std::矢量线;
弦线;
对于(int i=0;i<5;i++){
标准::getline(cin,line);
线。推回(线);
}
auto linepos=行。开始();
while(linepos!=lines.end()){
//cin.getline(str,PATH_MAX);改为:
//进程*linepos
++linepos;
}
}

seekg
最后调用:“此函数的基类版本无效。派生类可能会重写此函数以允许位置指示器的绝对定位。”类似
filebuf
stringbuf
的类会重写此函数并执行一些有用的操作,但是,
cin
没有使用其中的一个。底线:您不能在
cin
上搜索。如果您想再次查看数据,请将其读取并存储在某个位置。
cin.seekg(cin.beg)不正确,应为
cin.seekg(0),但最有可能的是
std::cin
根本不可查找。不需要这样做。
seekg
最终调用:“此函数的基类版本无效。派生类可以重写此函数以允许位置指示器的绝对定位。”类似
filebuf
stringbuf
的类重写它并执行一些有用的操作,但是,
cin
没有使用其中的一个。底线:您不能在
cin
上搜索。如果您想再次查看数据,请将其读取并存储在某个位置。
cin.seekg(cin.beg)不正确,应为
cin.seekg(0),但最有可能的是
std::cin
根本不可查找。没有要求它应该是。