相关疑难解决方法(0)

如何用C++编写自定义输入流

我正在学习C++(来自Java),我正在尝试理解如何在C++中正确使用IO流.

假设我有一个Image包含图像像素的类,我重载了提取操作符以从流中读取图像:

istream& operator>>(istream& stream, Image& image)
{
    // Read the image data from the stream into the image
    return stream;
}
Run Code Online (Sandbox Code Playgroud)

所以现在我能够读到这样的图像:

Image image;
ifstream file("somepic.img");
file >> image;
Run Code Online (Sandbox Code Playgroud)

但现在我想使用相同的提取运算符从自定义流中读取图像数据.假设我有一个包含压缩形式图像的文件.因此,我可能想要实现自己的输入流,而不是使用ifstream.至少我就是这样用Java做的.在Java中,我会编写一个扩展InputStream类并实现该int read()方法的自定义类.所以这很容易.用法看起来像这样:

InputStream stream = new CompressedInputStream(new FileInputStream("somepic.imgz"));
image.read(stream);
Run Code Online (Sandbox Code Playgroud)

所以使用相同的模式我想在C++中这样做:

Image image;
ifstream file("somepic.imgz");
compressed_stream stream(file);
stream >> image;
Run Code Online (Sandbox Code Playgroud)

但也许这是错误的方式,不知道.扩展istream类看起来相当复杂,经过一些搜索后我发现了一些关于扩展的提示streambuf.但是这个例子对于这么简单的任务看起来非常复杂.

那么在C++中实现自定义输入/输出流(或streambufs?)的最佳方法是什么?

有些人建议不要使用iostreams,而是使用迭代器,boost或自定义IO接口.这些可能是有效的替代品,但我的问题是关于iostreams.接受的答案产生了下面的示例代码.为了更容易阅读,没有标题/代码分离,导入整个std命名空间(我知道这在实际代码中是一件坏事).

这个例子是关于读写垂直xor编码的图像.格式非常简单.每个字节代表两个像素(每像素4位).每行与前一行xor'd.这种编码使图像准备好进行压缩(通常会导致大量的0字节更容易压缩).

#include <cstring>
#include <fstream>

using namespace std;

/*** vxor_streambuf class ******************************************/

class vxor_streambuf: public …
Run Code Online (Sandbox Code Playgroud)

c++ iostream

53
推荐指数
2
解决办法
4万
查看次数

将Qt与STL和Boost混合 - 是否有任何桥梁可以轻松实现?

是否有任何桥梁可以使Qt与STL和Boost混合尽可能无缝且简单?

这是混合Qt和Boost的后续,其中没有给出如何实现这一点的具体答案.

c++ qt boost stl

15
推荐指数
1
解决办法
8366
查看次数

如何从非Qt函数访问Qt资源数据

据我了解,在Qt应用程序中打包非代码资源(如数据文件)的方法是使用资源系统.但是,如果我想使用非Qt函数访问资源该怎么办?例如,我可能有一个.txt或.csv文件,其中包含一些我想使用ifstream访问的应用程序数据.似乎不能使用":..."语法代替非Qt函数和类的文件名.是否有单独的工作流程来打包应用程序中非Qt函数使用的数据?

我正在使用OSX,但我认为这些问题与平台无关.

c++ qt packaging

10
推荐指数
1
解决办法
2347
查看次数

如何返回fstream(C++ 0x)

我想我会直接进入它并从代码开始:

#include <iostream>
#include <fstream>
#include <string>

class test : public std::ofstream
{
    public:
        test(const std::string& filename) { this->open(gen_filename(filename)); };
        test(const test&) = delete;
        //test(test&& old) = default; // Didn't compile
        test(test&& old) {};
    private:
        std::string gen_filename(const std::string& filename) 
        { return filename + ".tmp"; }
};

int main()
{
    auto os = test("testfile");
    os << "Test1\n";
    os << "Test2\n";
}
Run Code Online (Sandbox Code Playgroud)

基本上,我需要返回一个流.当然你不能复制一个ofstream,所以我在类测试中摆弄代码,然后我按照你的预期编译和工作(在gcc 4.5上).

但我感觉不好这只是因为我的编译器在"auto os = test()"上做了"返回值优化"(RTO).的确,如果修改为以下内容:

int main()
{
    auto os = test("testfile");
    os << "Test1\n";
    auto os2 = std::move(os); …
Run Code Online (Sandbox Code Playgroud)

c++ fstream move-semantics return-value-optimization c++11

7
推荐指数
1
解决办法
2822
查看次数