gpt4 book ai didi

c++ - C++ 中的复合 std::istream

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:45 25 4
gpt4 key购买 nike

我有一个 std::istream 对象列表,我需要将它们显示为单个 std::istream 对象。因此,如果我有三个 istream,A、B 和 C,我希望能够创建一个 istream,D 将首先从 A 返回字节,然后返回字节从 B 开始,然后在到达 EOF 之前到达 C。复合流将始终按顺序读取并在读取所有字节后关闭。

有没有使用 STL/boost 的简单方法,或者我只需要编写自己的复合 istream?

最佳答案

另一个问题的题外话答案 ( https://stackoverflow.com/a/17103292/1424877 ) 可能会对您有所帮助。

#include <iostream>
#include <string>
#include <sstream>

class ConcatStreams : public std::streambuf
{
int useBuf;
std::streambuf *sbuf_[2];
char buffer_[1024];

public:
ConcatStreams(std::istream& sbuf1, std::istream& sbuf2) :
useBuf(0), sbuf_{sbuf1.rdbuf(), sbuf2.rdbuf()}
{ }

int underflow()
{
if (this->gptr() == this->egptr()) {
std::streamsize size = 0;
while (useBuf < 2) {
size = this->sbuf_[useBuf]->sgetn(this->buffer_, sizeof this->buffer_);
if (!size) {
useBuf++;
} else {
break;
}
}
this->setg(this->buffer_, this->buffer_, this->buffer_ + size);
}
return this->gptr() == this->egptr()
? std::char_traits<char>::eof()
: std::char_traits<char>::to_int_type(*this->gptr());
}
};

int main()
{
std::istringstream is("hello world!\n");

ConcatStreams cs_(is, std::cin); // prepend "hello world" to the input
std::istream cs(&cs_);

std::string s;
while (cs >> s)
std::cout << "'" << s << "'" << std::endl;
}

请注意,您不能使用此特殊技巧将 std::cin 与其自身连接起来,甚至不能将 is 与其自身连接起来;但连接任何两个不同输入流应该没问题。您甚至可以连接多个 ConcatStreams 实例!

关于c++ - C++ 中的复合 std::istream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19506444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com