重定向输入和输出时如何处理主文件I/O?

How to handle file I/O outside of main when redirecting input and output?

本文关键字:主文件 处理 输入 输出 何处理 重定向      更新时间:2023-10-16

我正在处理的程序的一个限制是它应该被调用为:./a.out < input.txt > output.txt.该程序的输入应从第一个文件读取,输出应写入第二个文件。

因此,这会将标准输入和输出重定向到这两个文件。例如,我可以简单地从main()打电话给std::cinstd::cout.但是,我有一个专用组件,它将我的输入从文件调整为我在程序其他地方使用的中间结构。

为了构建这个结构,我可以#include <iostream>这个组件,并从input.txtstd::cin阅读。但是,我不喜欢在这里包含iostream的想法,我不确定我将如何测试它。

我的问题来自I/O重定向,如果使用文件名作为字符串调用可执行文件,我会做一些类似的事情

InputAdapter inputAdapter;
ifstream infile;
infile.open(filename ,std::ios_base::in);
auto structHoldingParsedInput = inputAdapter.adapt(infile);

我怎样才能在这里实现类似的东西?

我建议您将适配器参数设为std::istream&std::ostream&,以便您可以传入标准std::cin/std::cout或您自己打开的文件,例如std::ifstream

有点像这样:

class InputAdapter
{
public:
void adapt(std::istream& in)
{
// code to convert input to output here
return created_object;        
}
};
// ...
InputAdapter inputAdapter;
std::ifstream in("input_file");
auto structHoldingParsedInput = inputAdapter.adapt(in);

现在,您正在编码流而不是可以使用任何流的文件,例如标准输入流:

auto structHoldingParsedInput = inputAdapter.adapt(std::cin);

并且,对于测试,您可以使用std::istringstream

std::istringstream test_stream(R"(
put your test data in here
)");
auto structHoldingParsedInput = inputAdapter.adapt(test_stream);