【问题标题】:c++ What does this argument mean in the command line? | grep MATCH >zoutmatchessc++ 这个参数在命令行中是什么意思? | grep 匹配 >zoutmatchess
【发布时间】:2017-02-20 16:56:32
【问题描述】:

所以我有三个参数从命令行执行我的程序,如下所示:

../../xinputa.txt ../../xinputb.txt | grep MATCH > aoutmatches

(这个命令是作为要使用的参数提供给我的)。

在我的程序的主要部分,我有:

int main(int argc, char *argv[]) {
  double timenew = 0.0;
  string data_filename = "";
  string pattern_filename = "";
  string timestring = "";
  string outFileName = "";
  ofstream cout;

  Scanner in_scanner;

  SMatch stringmatch;

  CheckArgs(3, argc, argv, "datafilename patternfilename outfilename");
  data_filename = static_cast<string>(argv[1]);
  pattern_filename = static_cast<string>(argv[2]);
  outFileName = static_cast<string>(argv[3]);

  FileOpen(cout, outFileName);


  cout << kTag << "Beginning execution\n";

我有很多行看起来像正上方的那一行^

我完成了我的 main.cc:

FileClose(cout);

此信息只是为您提供一些背景信息。我只想知道

这些论点符合我的要求以及这个论点的确切含义:

| grep MATCH >zoutmatchess 

【问题讨论】:

  • cout 是一个非常糟糕的文件流名称。极易与标准输出流std::cout混淆。
  • | grep MATCH &gt;zoutmatchess 是一个名为grep 的命令的管道。 &gt; 将 grep 的输出附加到指定的文件名。

标签: c++ linux unix parameters arguments


【解决方案1】:

../../xinputa.txt ../../xinputb.txt | grep MATCH > aoutmatches

就目前而言,您的程序有以下命令行参数:

  • argv[0] 是你的程序名
  • argv[1] 指向 ../../xinputa.txt
  • argv[2] 指向 ../../xinputb.txt

| grep MATCH &gt; aoutmatches 部分本身不是命令行参数。它是一种管道机制,可以将程序输出定向到grep 的输入,并将该grepping 的结果再次重定向到文件名aoutmatches

【讨论】:

  • 好的,太棒了。仍然得到空白的输出文件!我不确定如果像 cout &lt;&lt; kTag &lt;&lt; "Beginning execution\n"; 这样的行应该使用管道,我会错过什么
  • cout &lt;&lt; kTag &lt;&lt; "Beginning execution\n" 打印到标准输出并通过管道传输到 grep - 空白输出文件意味着您在标准输出中没有任何 MATCH 用于搜索 grep
【解决方案2】:

| grep MATCH &gt;zoutmatchess 不是提供给程序的参数列表的一部分,假设它是这样调用的:

./myProgram ../../xinputa.txt ../../xinputb.txt | grep MATCH > aoutmatches

| 是一个管道,表示从前面的命令到标准输出(标准输出,又名std::cout)的输出应该重定向到下面命令的标准输入(标准输入,又名std::cin)。

&gt;也是对前面命令的stdout的重定向,但是这次重定向到token后面指定的文件。

因此,您的线路的作用如下:

../../xinputa.txt../../xinputb.txt 两个参数开始myProgram。同样以一个参数MATCH 开始grep,然后将myProgram 的输出作为输入传递给grep,最后将grep 的输出写入文件aoutmatches

grep 是一个过滤包含特定字符串 (MATCH) 的行的命令。

因此,您应该只从argv 获取前两个参数(三个包括索引零的一个,即程序名称)并将结果写入文件,而不是std::cout

【讨论】:

  • 哇。从字面上看很有帮助。这就是程序被调用的方式。这也可以解释为什么有这么多行包含 cout 的代码。但是,如果我从上面的代码中删除 ofstream 和 outputfile 名称的东西,我仍然没有得到任何输出。我的两个文件是执行后产生的空白。有很多行的格式如下:
  • 'cout
  • 我错过了什么吗?这种格式似乎符合您对命令行实际要求的描述。还是什么都没有……
  • 我应该把 'kTag' 改成 MATCH 吗?
  • 在仔细阅读了您的答案后,我意识到我需要在要通过管道传输到输出文件的每一行文本中包含 MATCH。再次感谢您
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多