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

时间:2014-11-19 09:54:53

标签: c++ linux io cin

我编写了一个可以从文件中获取信息的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, 使它可以从标准输入...

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

2 个答案:

答案 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