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

时间:2018-11-25 15:23:48

标签: c++ std cin istream

在尝试使用cin.getline()5次后,我试图通过重新调用cin.seekg()来重新读取cin缓冲区,但是在再次调用cin.getline()之后,而不是重新从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;
}

1 个答案:

答案 0 :(得分:2)

  

我尝试使用cin 5次后重新读取cin.getline()缓冲区

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

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

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