重定向输入和输出时如何处理主文件I/O?
How to handle file I/O outside of main when redirecting input and output?
我正在处理的程序的一个限制是它应该被调用为:./a.out < input.txt > output.txt
.该程序的输入应从第一个文件读取,输出应写入第二个文件。
因此,这会将标准输入和输出重定向到这两个文件。例如,我可以简单地从main()
打电话给std::cin
并std::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);
我怎样才能在这里实现类似的东西?
我建议您将适配器参数设为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);
相关文章:
- 如何使用命令提示符、记事本和 MinGW 使用主文件、头文件和实现文件编译C++程序?
- CLANG 格式不对主文件进行排序
- C++警告:编译指示在主文件中一次
- 如何在其他文件中使用主文件的场景对象
- 尝试在 ahead 文件上使用结构,并将其包含在主文件和类文件中
- 将函数及其实现移动到与主文件不同的文件(.hpp 和 .cpp)时,性能会受到很大影响
- 无论如何,在我的主文件之外传递 argc、argv .cpp
- 编译几个源文件(主文件和头文件)并在ROOT CINT中链接它们
- 如何在同一个主文件中转发声明类似模板函数的模板类
- Xcode 不会检测包含文件中的主文件中包含的文件
- 带有C++主文件的 FreeRTOS
- 如何防止基于 MFC 对话框的应用在 ESC 键后关闭,但允许其他控件处理它
- 如何创建一个只有主文件和模板头(C++)的makefile
- 文件移动 - 操作系统如何知道是更新主文件表还是复制和删除
- 无法从头文件C++从主文件访问函数
- 在 Mingw 主文件夹之外构建和编译文件
- C++主文件不显示所有内容
- 定义函数后主文件出错? "undefined reference to 'sequence::sequence()'"
- 在我的主文件中全局创建c++类实例
- 如何将主文件分成三个文件:头文件、客户端和实现