关于"int main(int argc, char* argv[])"知识的缺乏

4

我是一名物理学家,通常情况下,我只想完成计算,这就是我真正需要的。尽管如此,我之前一直在使用

int main(int argc, char* argv[])

令人愉悦的是,二进制在我没有预料到的层面上变得更加灵活,例如初始化变量。

~$ ./program.exe a b c   (a, b and c are numbers in this case, not letters ok?)

所以问题是:

*如何在不使用文件的情况下进行类似于“解析”或“管道传输”的操作?*

例如:假设“a.exe”提供了一组“X-Y”点(类似于电子表格上的点),我想将其插入到“b.exe”中。或者说,我使用bash/awk脚本来格式化“a.exe”的输出格式,以便在gnuplot上绘制它。

-----------------------------------------

您好。我仍在尝试做到这一点,但仍然遇到问题。

为了看出我做错了什么,我编写了最简单的程序。

   #include <cstdio>
   #include <iostream>
   #include <cmath>

   using namespace std;

   int main(int argc, char* argv[]){

   for (int i = 0; i <= argc; i++)
     cout << "argv[" << i << "]= " << argv[i] << endl;  


   getchar();   
   return 0;
   }

并创建了一个内容为(假设是“test.dat”)的文件。

 1 
 2 
 3 
 4
 5 
 6 

由于我不想在我的程序中读取文件的内容,只是想把它“扔”进去,所以我尝试过

more test.dat | ./program.exe

甚至可以
 ./program.exe << EOF
 1 2 3 4 5
 EOF

但它无效了,我原以为它可以工作。再次感谢您。

9
这个问题应该发布在stackoverflow上。 - greatwolf
1
你可以使用xargs命令将文件内容转换为命令行参数。cat test.dat | xargs preogram.exe - Jerry Jeremiah
1个回答

10

你混淆了参数和管道这两个概念。

main函数中指定的参数处理的是参数,而不是管道。

"管道"字符|用于进行管道操作,它不影响参数,而是影响输入和输出流。 <> 可以用于从文件中导入或导出数据到管道。

程序调用之后添加的内容都是参数,例如:

progam.exe arg1 arg2 arg3

这些内容将由程序中的模板代码进行解析,并在调用main函数时出现在argv数组中。

当您使用<字符将文件输送到程序中时,文件的内容将被发送到程序的输入流中:

program.exe < data.txt

该程序不会有控制台输入(屏幕和键盘),而是从文件中获取数据。

当您使用 > 字符来将输出导向文件时,程序的输出会写入文件,而非控制台。例如:

program.exe > result.txt

当你使用 | 字符将一个程序的输出导入到另一个程序时,第一个程序的输出流就成为了另一个程序的输入流。例如:

program.exe | sort.exe

第一个程序输出的所有内容都会进入第二个程序的输入流中。如果您没有指定任何输入或输出文件,第一个程序具有控制台输入,而第二个程序具有控制台输出。因此,数据通过这两个程序流动,如下所示:

[console] --> [program.exe] --> [sort.exe] --> [console]

你可以通过管道将多个程序连接起来,使数据从第一个程序流向最后一个程序。例如:

program.exe | sort.exe | more.exe
数据随后会流经这三个程序:
[console] --> [program.exe] --> [sort.exe] --> [more.exe] --> [console]

(通常在指定程序时,不需要使用 .exe 扩展名,我仅将其包含在此处,以清楚地区分程序、参数和文件。)


1
好的回答-值得补充的是,从输入流中获取输入可以使用scanf,将输出发送到输出流的方法是使用printf - Sanjay Manohar
此外,重要的是要意识到这些运算符(<、> 和 |)在典型环境中都是由 shell 实现的,实际的程序二进制文件不需要做任何事情,事实上也不知道使用了这些运算符。它们不会出现在 argv[] 中。 - unwind
那真的很有帮助,Guffa。现在我知道它代表什么了。不过,我刚刚尝试了另一件事情,但我仍然没有得到我需要的东西。我只是编辑了帖子。我不想读,我想要向程序“扔”东西。 - stringparser
2
如果您想要结合管道和参数,请使用xargs。 cat data.txt | xargs | program - KarlM
那个方法可行,但是使用“cat data.text | xargs ./program”更好。谢谢KarlM。 - stringparser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接