【问题标题】:C++: how to get input using two kind of ways,like cin and file?C ++:如何使用cin和file等两种方式获取输入?
【发布时间】:2014-11-19 09:54:52
【问题描述】:

我写了一个可以从文件中获取信息的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);

私人: 内部::SamReaderPrivate * d; };

我已经有了输入文件并得到结果的方法,但是我需要在这个类中添加一个func, 让它可以从标准输入...

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

【问题讨论】:

  • 取决于是否有命令行参数,要么从std::cin读取,要么从命令行参数指定的文件中读取。
  • 什么意思,第二种方式更重要?对于命令行程序,通常的约定是将输入文件的名称作为参数传递给函数,如果没有则从标准输入中读取(或者如果文件的名称是"-")。

标签: c++ linux io cin


【解决方案1】:

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

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

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

#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

【讨论】:

  • 为避免代码重复,请阅读std::istream(或FILE*,尽管这通常不是一个好主意)。
【解决方案2】:

就像@Sander De Dycker 所说的那样。这不关程序的事。这取决于你使用的 shell,我猜你使用的是经典的 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.txta.txt 用作输出,或键入cat a.txt | ./a.outa.txt 用作输入。或者你也可以混合使用这两个命令。

【讨论】:

  • 应该是./a.out &gt; a.txt。对于输入,./pgm &lt; in.txt 更简单 IMO。两者都可以混合。 (好吧,重定向的确切语法取决于您使用的 shell。但我们在这里假设经典 sh。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 2011-02-24
  • 2011-01-11
  • 1970-01-01
相关资源
最近更新 更多