gpt4 book ai didi

c++ - 如何使用 boost::iostreams 将 bash 脚本转换为 C++

转载 作者:可可西里 更新时间:2023-11-01 16:43:47 25 4
gpt4 key购买 nike

我正在尝试使用 boost::iostreams 将以下 bash 代码转换为 C++:

#!/usr/bin/bash
(
gzip -cd file1.ext.gz
cat file2.ext
) | grep '^regex' # or sed 's/search/replace/'

我可以打开一个文件并解压它:

std::ifstream s("file.ext.gz", std::ios_base::in | std::ios_base::binary);
boost::iostreams::filtering_istreambuf in;
in.push(boost::iostreams::gzip_decompressor());
in.push(s);

然后打开一个未压缩的文件:

std::ifstream s2("file.ext", std::ios_base::in | std::ios_base::binary);

现在我有点卡住了,所以这是我的问题:

1) 什么是连接两个流的 boost::iostreams 解决方案?

2) 如何通过正则表达式过滤器输出结果来模拟grep/sed?

因此,我想要一个可以复制到 cout 的 istream:

boost::iostream::copy(result, std::cout);

更新 使用 Hamigaki's concatenate 的完整解决方案:

/*
* convert the following bash script into C++
*
* #!/bin/bash
* (
* gzip -cd file1.ext.gz
* cat file2.ext
* ) | grep '^filter' | 'sed s/search/replace/g'
*
*/

#include <iostream>
#include <boost/bind.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/filter/regex.hpp>
#include <boost/iostreams/filter/grep.hpp>
#include <boost/iostreams/copy.hpp>

// http://hamigaki.sourceforge.jp/hamigaki/iostreams/concatenate.hpp
#include "concatenate.hpp"

namespace io = boost::iostreams;

int main(int argc, char const* argv[])
{
io::file_source file1("file1.ext.gz");
io::file_source file2("file2.ext");
io::gzip_decompressor gzip;
io::regex_filter sed(boost::regex("search"), "replace");
io::grep_filter grep(boost::regex("^filter"));

io::filtering_istreambuf in1(gzip | file1);
io::filtering_istreambuf in2(file2);

io::filtering_istreambuf combined(sed | grep |
hamigaki::iostreams::concatenate(
boost::ref(in1),
boost::ref(in2)
)
);

io::copy(combined, std::cout);

return 0;
}

最佳答案

1) 我不知道 boost 中是否内置了任何东西,但是这个类似乎正是您想要的:http://hamigaki.sourceforge.jp/hamigaki/iostreams/concatenate.hpp

这里的问题是它期望 CopyConstructible 设备连接起来,而 Chains 似乎不是 CopyConstructible。然而,我们可以使用 boost::ref 轻松解决这个问题。这段代码(几乎)完成了我所理解的您的要求:

int main(int argc, char const* argv[])
{
boost::iostreams::filtering_istreambuf in;
boost::regex regex("search");
boost::iostreams::regex_filter rf(regex, "replace");
in.push(rf);

boost::iostreams::file_source file1(argv[1]);
in.push(file1);

boost::iostreams::file_source file2(argv[2]);
boost::iostreams::copy(hamigaki::iostreams::concatenate(boost::ref(in), file2), std::cout);

return 0;
}

我只是使用正则表达式过滤器而不是 gzip 进行测试。

2) boost::iostreams 有一个正则表达式过滤器:http://www.boost.org/doc/libs/1_45_0/libs/iostreams/doc/classes/regex_filter.html

编辑:您现在似乎可以正常工作了。

关于c++ - 如何使用 boost::iostreams 将 bash 脚本转换为 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5072058/

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