繁体   English   中英

C++:从(到)文件读取(写入)如果提供,否则回退到 std::cin (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::cinstd::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::ostreamstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM