请求实现符合描述的C++管道架构并补充组件连接逻辑
符合设计的完整C++实现
核心设计说明
- Source:数据来源接口,提供
readsome方法读取数据。 - Sink:数据输出接口,提供
writesome方法写入数据。 - Filter:同时继承Source和Sink的抽象类,作为数据处理中间层的基类,子类可实现具体的转换逻辑。
- Pipe:特殊的Filter,仅做数据透传,不修改内容。
完整代码实现
#include <cstdio> #include <string> #include <algorithm> class Source { public: virtual std::string readsome() = 0; virtual ~Source() = default; }; class Sink { public: virtual void writesome(const std::string& s) = 0; virtual ~Sink() = default; }; // Filter抽象类:同时实现Source和Sink,提供缓冲区暂存数据 class Filter : public Source, public Sink { protected: std::string buffer; }; // Pipe类:直接透传数据的Filter class Pipe : public Filter { public: void writesome(const std::string& s) override { buffer += s; } std::string readsome() override { std::string data = buffer; buffer.clear(); return data; } }; // 标准输入Source实现 class Stdin : public Source { public: std::string readsome() override { char buf[4096]; size_t nread = fread(buf, 1, sizeof(buf), stdin); return std::string(buf, nread); } }; // 标准输出Sink实现 class Stdout : public Sink { public: void writesome(const std::string& s) override { fwrite(s.c_str(), 1, s.size(), stdout); } }; // 字符替换Filter实现 class Tr : public Filter { const char from; const char to; public: Tr(char f, char t) : from(f), to(t) {} // 接收数据并处理,存入缓冲区 void writesome(const std::string& s) override { std::string processed = s; std::replace(processed.begin(), processed.end(), from, to); buffer += processed; } // 输出处理后的数据 std::string readsome() override { std::string data = buffer; buffer.clear(); return data; } }; // 辅助函数:从Source读取数据并写入Sink void pipe_data(Source& src, Sink& dest) { std::string data; while (!(data = src.readsome()).empty()) { dest.writesome(data); } } int main() { // 实例化各个组件 Stdin input; Tr tr_filter('a', 'x'); // 将所有'a'替换为'x' Stdout output; // 数据流动路径:Stdin → Tr过滤器 → Stdout pipe_data(input, tr_filter); // 输入数据写入Tr(Tr作为Sink) pipe_data(tr_filter, output); // Tr处理后的数据写入输出(Tr作为Source) return 0; }
运行说明
编译运行后,输入任意包含字符'a'的文本,按下Ctrl+D(Linux/macOS)或Ctrl+Z(Windows)结束输入,程序会将所有'a'替换为'x'并输出到控制台。
内容的提问来源于stack exchange,提问作者malat
相关产品推荐
相关产品推荐

