如何改变c++ boost::iostreams中源/接收设备的读写方式?



我正试图熟悉boost::iostream,所以在我正在编写的示例程序中,我想从文件中读取文本并将其写入文件。
我将使用从file_source/file_sink继承的类作为读/写设备。在read方法中,我的类需要给每个字符加1,write方法需要从每个字符中减去1。
首先,我要确保程序的读取部分工作正常,以便您可以看到如下代码:

#include <boost/iostreams/stream.hpp>
#include <fstream>
#include "MyFileSource.h"
#include <iostream>
using namespace std;
using namespace boost::iostreams;
int main()
{
MyFileSource<char> fileSource("source.txt");
stream<MyFileSource<char>> myStream(fileSource);
std::cout << myStream.rdbuf();
fileSource.close();
}  

和我继承的源设备代码如下:

template <typename charType>
class MyFileSource : public boost::iostreams::file_source
{
public:
MyFileSource(const std::string& path) : boost::iostreams::file_source(path)
{
file_path = path;
if (!is_open())
open(path);
seek(0, ios::end);
sizeOfFile = seek(0, ios::cur);
seek(0, ios::beg);
buffer = new charType[sizeOfFile];
}
std::streamsize read(charType*, std::streamsize)
{
std::streamsize readCount = boost::iostreams::file_source::read(buffer, sizeOfFile);
if (readCount > 0)
{
std::string result(buffer, readCount);
for (char& c : result)
c++;
finalResult = result;
}
return readCount;
}
private:
string file_path;
int sizeOfFile;
charType* buffer;
std::string finalResult;
};
不幸的是,std::cout <<myStream.rdbuf ()如果我删除MyFileSource类的read方法来使用父类的read方法,结果将是正确的。
任何帮助都将是感激的。

我解决了这个问题…

template <typename charType>
class MyFileSource : public boost::iostreams::file_source
{
public:
MyFileSource(const std::string& path) : boost::iostreams::file_source(path)
{
if (!is_open())
open(path);
}
std::streamsize read(charType* s, std::streamsize n)
{
std::streamsize readCount = boost::iostreams::file_source::read(s, n);
if (readCount > 0)
{
std::string result(s, readCount);
for (auto& c : result)
c++;
std::copy(result.begin(), result.end(), s);
}
return readCount;
}
};

可以看到,通过删除额外的缓冲区变量并将其替换为s,问题得到了解决。

相关内容

  • 没有找到相关文章