我编写了一个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/