【问题标题】:How to handle file I/O outside of main when redirecting input and output?重定向输入和输出时如何处理main之外的文件I/O?
【发布时间】:2018-08-23 15:30:34
【问题描述】:

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

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

为了构建这个结构,我可以在这个组件中使用#include <iostream> 并从input.txt 读取std::cin。但是,我不喜欢在此处包含 iostream 的想法,而且我不确定如何测试它。

我的问题来自 I/O 重定向,如果使用文件名作为字符串调用可执行文件,我会按照

    InputAdapter inputAdapter;

    ifstream infile;
    infile.open(filename ,std::ios_base::in);

    auto structHoldingParsedInput = inputAdapter.adapt(infile);

我怎样才能在这里实现类似的目标?

【问题讨论】:

  • “我不喜欢在此处包含 iostream” - 为什么?它会立即解决您的问题。
  • 您只需要std::istream& 参数。我可能没有完全理解你的问题
  • 您知道std::ifstreamstd::cin 在传递给带有std::istream& 参数的函数时可以互换吗?与std::ofstreamstd::coutstd::ostream& 相同。
  • @Galik 保持单一职责,我想要一个适配器来获取一个打开的文件并构建这个结构。它不必担心解析命令行参数和文件 I/O。此外,这会将适配器绑定到特定的输入流,将来如果输入文件来自其他来源而不是作为可执行文件的参数会怎样。
  • 这就是为什么我认为你应该使用std::istream&std::ostream&适配器参数并将std::cinstd::cout作为参数传递给它。

标签: c++ file io fstream io-redirection


【解决方案1】:

我建议您将适配器参数设置为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);

现在您正在编码到 streams 而不是 files 您可以使用 any 流,例如标准输入流:

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);

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2012-11-14
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多