用于C ++的可移植字节流接口

时间:2010-10-05 19:37:38

标签: c++ stream portability

我在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()方法是虚拟的。

4 个答案:

答案 0 :(得分:4)

如果您的库接受std::istream,那么它将使用文件,内存缓冲区和用户定义的流。

您的混淆似乎是istream没有任何虚拟成员可以覆盖和自定义。这是因为istream将所有可自定义的功能委托给std::streambuf,这是您可以找到虚拟成员的地方。

如果您希望将压缩结果公开为流,则需要从streambuf派生。相反,您可以接受istream来读取,ostream将压缩结果存储到。{/ p>

通过接受istream,您的客户可以提供istream构建在任何streambuf上,stringbuffilebuf库或自定义版本

由于您不想使用文本数据而是使用字节流,因此可能直接使用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)

std :: fstream听起来很合适,尽管你觉得它缺乏适当性,对我来说非常合适。当然它有一个寻求,但它不是很重的代码。