【问题标题】:How to keep the buffer of std::cin after using std::cin.getline()使用 std::cin.getline() 后如何保留 std::cin 的缓冲区
【发布时间】: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:“此函数的基类版本无效。派生类可能会覆盖此函数以允许位置指示器的绝对定位。”像 filebufstringbuf 这样的类会覆盖它并做一些有用的事情,但 cin 没有使用其中之一。底线:你不能在cin 上寻找。如果您想再次查看数据,请将其读取并存储在某处。
  • cin.seekg(cin.beg); 不正确,它应该只是 cin.seekg(0);,但很可能是 std::cin 根本不可搜索。没有要求它应该是。

标签: c++ std cin istream


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-06-12
    • 2018-12-15
    • 2010-12-23
    • 2020-12-12
    • 2021-02-10
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多