C++:如何使用cin和file两种方式获取输入?

标签 c++ linux io cin

我编写了一个C++程序,它可以从文件中获取信息,但它必须支持两种读取数据的方式。

第一种方法是将文件名作为命令行参数传递:./a.out a.txt

第二个是通过从管道读取:cat a.txt | ./a.out

第二种方式对我来说更重要,也更困难。怎么办?

以下是我的问题的详细信息:

有一个类,我这样定义:

API_EXPORT SamReader 类{

// constructor / destructor

公开: SamReader(无效); ~SamReader(void);

// closes the current SAM file
bool Close(void);
// returns filename of current SAM file
const std::string GetFilename(void) const;

// return if a SAM file is open for reading
bool IsOpen(void) const;

// opens a SAM file
// *** HERE IS MY QUESTION
bool Open(const std::string& filename);
bool Open(std::istream cin); //HERE~~~~

// retrives next available alignment
bool LoadNextAlignment(BamAlignment& alignment);

私有(private): 内部::SamReaderPrivate * d; };

我已经找到了输入文件并获取结果的方法,但是我需要在此类中添加一个 func, 使其可以从标准输入输入...

感谢您的帮助,我是这里的新人,我非常感谢刚才帮助我的人。

最佳答案

要从管道读取,您的程序只需要从标准输入读取即可。如果你运行 a | 这就是 shell 中的管道的工作原理。 b,它只是将 a 的 stdout 上的所有输出传递到 b 的 stdin。

所以基本上你的程序需要涵盖两种情况:(1) 如果提供了文件,则从文件中读取;(2) 否则从标准输入中读取。

为了避免代码重复,最简单的方法始终是从 stdin 读取。这显然涵盖了(2)。为了涵盖 (1),当将文件作为参数提供时,请使用 freopen 使用该文件覆盖 stdin。

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char** argv) {
  if (argc > 1) {
    freopen(argv[1], "r", stdin);
  }

  string s;
  while (cin >> s) {
    cout << s << endl;
  }

  return 0;
}

演示其工作原理

$ g++ test.cc
$ cat content
This
is
a
test
$ ./a.out content
This
is
a
test
$ cat content | ./a.out
This
is
a
test

关于C++:如何使用cin和file两种方式获取输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27013777/

相关文章:

c++ - 在 C++ 中实现纯虚类的问题

C++ SDK WFP 标注函数

c++ - 动态加载使用 --wrap=malloc 编译的库时未解析的符号 __real_malloc

c++ - OpenCV 与 OpenWRT 交叉编译时出错

python - 在 Python 中执行 I/O 的最快方法是什么?

f# - 良好的 F# 异步 IO 示例

c++ - Boost 1.51.0 和 Code::Blocks

c++ - 在容器 : hardcode the container type, 上运行的方法还是使用通用模板迭代器?

java - 如何使用java程序访问Linux机器中的文件和目录

java - 如何使用 Java 进行面向 block 的磁盘 I/O?或类似的 B+ 树