【问题标题】:peek multiple chars from cin with putback用 putback 从 cin 中窥视多个字符
【发布时间】:2016-05-04 20:54:47
【问题描述】:

我需要尝试从std::istream(可能是std::cin)中查看多个字符,所以我编写了一个简单的循环来多次调用get(),然后多次调用putback()

std::vector<char> peek_many(std::istream& is, int N) {
    std::vector<char> data;
    data.reserve(N);

    for (int i = 0; i < N; ++i) {
        data.push_back(is.get());
    }   

    for (int i = 0; i < N; ++i) {
        is.putback(data[N-i-1]);
    }

    return data;
}

这是否保证适用于所有istreams(无论我正在读取文件、cinistringstream 等)吗?如果不是,为什么不呢?

【问题讨论】:

  • std::istringstream 只能输入,只能从中读取,不能将putback() 数据写入其中。
  • 题外话,如果到达EOF,返回一个较短的向量不是更好,而不是返回一个带有尾随EOFs的向量吗?
  • @Remy 需要引用
  • @AlanStokes:在en.cppreference.com/w/cpp/io/basic_istream/putback 运行示例代码。 putback()std::istringstream 上失败,并被这样评论。
  • @RemyLebeau 你不能修改它——但你可以把相同的字符放回去——这就是我想要做的。

标签: c++ istream peek


【解决方案1】:

仅假设 1 个字符“宽”放回缓冲区是安全的。您将不得不添加额外的抽象层以提供更多的回退空间。

或者,如果您的流是可搜索的,您可以在开始试探性解析之前记住该位置,然后返回到记住的位置。

【讨论】:

  • 这样的抽象会是什么样子?
  • 代码中的额外缓冲级别。您从流中读取数据到您自己的足够大小的缓冲区中,然后您可以根据需要从缓冲区中读取/查看数据,而无需尝试将数据放回流中。
  • 或者你可以打电话给[pub]setbuf 告诉streambuf 你想要一个更大的缓冲区——除了遗憾的是一般来说没有有用的明确定义的行为。
【解决方案2】:

putback 调用 sputback 仅在有回退头寸可用时才有效。没有任何东西可以保证此类职位的数量是无限的。

【讨论】:

  • sputback 返回EOF 你用完了;-) 或者你可以看看gptr()eback(),这给了你一个下限。
  • 这些是protected
  • 公平点。假设您不愿意/不能从streambuf 中获得信息,我认为您对我的建议的前半部分持保留态度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多