我编写了一个可以从文件中获取信息的c ++程序,但它必须支持两种读取数据的方式。
第一种方法是将文件名作为命令行参数传递:./a.out a.txt
第二个是通过读取管道:cat a.txt | ./a.out
第二种方式对我来说更重要也更困难。怎么办呢?
以下是我的问题的详细信息:
有一个类,我定义如下:
类API_EXPORT SamReader {
// constructor / destructor
公共: SamReader(无效); 〜SamReader(无效);
// 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);
私人: 内部:: SamReaderPrivate * d; };
我已经有了输入文件并获得结果的方法,但是我需要在这个类中添加一个func, 使它可以从标准输入...
感谢您的帮助,我是这里的新人,我非常感谢刚才帮助我的人。
答案 0 :(得分:0)
就像@Sander De Dycker所说的那样。这不是计划的业务。这取决于你使用的外壳,我猜你使用经典的sh。
您可以编写一个非常简单的c ++程序,例如:
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<string> v;
string s;
while (cin >> s)
v.push_back(s);
for (int i = 0; i != v.size(); ++i)
cout << v[i] << endl;
return 0;
}
然后,您可以键入./a.out a.txt
以将a.txt
用作输出,或键入cat a.txt | ./a.out
以将a.txt
用作输入。或者你也可以混合这两个命令。
答案 1 :(得分:0)
要从管道读取,您的程序只需要从stdin读取。这就是shell中的管道工作原理,如果你运行a | b
,它只是将a
的stdout上的所有输出传递给b
的stdin。
所以基本上你的程序需要涵盖2个案例:(1)如果提供了一个文件,则从文件中读取;(2)否则从stdin读取。
为避免代码重复,始终从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