![](/img/trans.png)
[英]Read file in binary and output in hex std::cin to std::cout
[英]C++ : Read(Write) from(to) a file if provided otherwise fall back to std::cin (std::cout)
我有这个需要。 如果提供,则从/向文件读取或写入文件回退到好朋友std::cin
/ std::cout
,如下所示:
// pseudo code for problem statement.
int main(int argc, char* argv[])
{
istream reader;
ostrea writer;
if (argc > 1)
{
// we have path to our file in argv[]
reader = ifstream(infile);
writer = ofstream(outfile);
}
else
{
reader = cin;
writer = cout;
}
// rest of code
}
从本质上讲,即使我的想法很复杂,有没有办法实现类似的目标。 谢谢!
使用的环境:C++ 11、14、17。
编辑 #1:详细说明if
条件,如果程序被调用为
$: driver "input_file.txt" "output_file.txt"
它应该从这些文件中执行 IO,相反,如果这样调用,
$: driver < "input_file.txt" > "output_file.txt"
它应该使用std::cin
和std::cout
// 编辑结束#1
我正在阅读这里的参考资料,我在想这是否有帮助?
您可以考虑以下方法:
void read_write(ifstream&, ofstream&); // Overloaded reader-writer
void read_write(istream&, ostream&);
int main(int argc, char* argv[]) {
if (argc > 1) {
auto infile = argv[1];
auto outfile = argv[2]
read_write(infile, outfile);
} else read_write(cin, cout);
// rest of code
}
您可以使用指向std::ostream
或std::istream
基类的指针:
#include <iostream>
int main(int argc, char* argv[])
{
std::istream* reader;
std::ostream* writer;
bool deleteNeeded;
if (argc > 1)
{
// mark them for deletion, using a bool, for example
deleteNeeded = true;
// we have path to our file in argv[]
reader = new ifstream(infile);
writer = new ofstream(outfile);
}
else
{
// mark for no deletion, setting the same bool
deleteNeeded = false;
reader = &std::cin;
writer = &std::cout;
}
// rest of code
if(deleteNeeded)
{
delete reader; delete writer;
}
}
或者使用可以重新分配的引用之类的东西。
我涉足了它发布建议和感谢伙计们,这就是我想出的。
#include <iostream>
#include <fstream>
void solve(std::istream& in, std::ostream& out) {
int n;
in >> n;
out
<< n << " squared is "
<< static_cast<uint64_t>(n)*n << " !"
<< std::endl;
}
int main(int argc, char* argv[]) {
if (argc > 1) {
std::ifstream in(argv[1]);
std::ofstream out(argv[2]);
solve(in, out);
} else {
solve(std::cin, std::cout);
}
}
// call : ./driver in.txt out.txt
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.