我在open source portable C++ image compression library工作。目前,我的API通过与图像数据交换指向字节数组的指针来工作。我想支持某种流模式以获得更好的性能和内存消耗。
为此,我想知道是否有一个接口或抽象基类(C ++标准库的一部分),我可以将其用作输入字节流的接口,类似于Java的InputStream或C#Stream 。它可以这么简单:
class inputstream
{
public:
virtual void readbytes(char*, size_t count) = 0;
};
我可以自己定义这样的接口,但是我要求每个人都实现某种适配器来连接我的代码,以及我的IO错误处理的风格,我想避免这种情况。
理想情况下,这个接口或基类已经由一些现有的C ++标准库实现,用于读取文件。如果它不是基类,它应该是完全抽象的,所以我的用户可以连接到他们拥有的任何字节流(平台特定,套接字,等等)。我曾经在iostream中浏览过,但发现没有什么能符合这个要求。它应该尽可能轻:应该定义错误处理,但不需要寻找流。
如果没有这样的事情(我担心),是否有类似现有的最佳实践?就像带有标准签名的函数指针和错误处理契约一样?如果有创意解决方案也适用于C,我也很感兴趣。
编辑:关键是基类的read()方法是虚拟的。
答案 0 :(得分:4)
如果您的库接受std::istream
,那么它将使用文件,内存缓冲区和用户定义的流。
您的混淆似乎是istream
没有任何虚拟成员可以覆盖和自定义。这是因为istream
将所有可自定义的功能委托给std::streambuf
,这是您可以找到虚拟成员的地方。
如果您希望将压缩结果公开为流,则需要从streambuf
派生。相反,您可以接受istream
来读取,ostream
将压缩结果存储到。{/ p>
通过接受istream
,您的客户可以提供istream
构建在任何streambuf
上,stringbuf
或filebuf
库或自定义版本
由于您不想使用文本数据而是使用字节流,因此可能直接使用streambuf
比使用istream
包装它更好。
答案 1 :(得分:0)
看看stringstream。它可以满足您的需求
答案 2 :(得分:0)
您可以使用普通std::ifstream
,它只不过是“字节流”。字节提取默认为每字节字节数,可以以多种不同的方式使用:
#include <fstream>
using std::ifstream;
int main()
{
ifstream stream;
stream.open("example.jpg", ifstream::binary ); // open raw binary stream
if( !stream ) // check if stream is ready to be read
throw runtime_error( "Failed to open file..." );
char byteBuffer;
while( stream >> byteBuffer ) // read all bytes until read/extraction fails
{
// do something with the byte
}
stream.close();
return 0;
}
我希望这会有所帮助。我不明白每个平台都有一个字节大小的字符,但我确信有一些技巧允许你使用字节元素iostream对象(默认为char
或{{1对于宽类)。
答案 3 :(得分:0)