在'<'之后读取命令行参数在C.

时间:2009-09-29 17:11:01

标签: c command-line-arguments

首先我要说这与家庭作业有关。但是,这是一项非常小且相对微不足道的任务。

C程序通过命令行参数接收输入,但需要采用以下形式:

$ ./program < input

如何以字符串形式接收输入?每次我尝试从argv打印出第3个参数时,都会收到以下消息:

  

输入:没有这样的文件或目录。

10 个答案:

答案 0 :(得分:21)

&LT;是一个shell重定向 - 它在程序之外处理。您将看到的是发送到标准输入流的文件名“input”的内容。这是程序操作的常用方法,尽管它们通常也处理给出文件名,例如文件名。 sed

如果我不得不猜我会想:

input: No such file or directory.

来自shell,因为它无法打开指定的文件:“input”。

另一方面,如果你真的希望< input作为程序的参数,你可以转义或引用它们,这样shell就不会解释它们。 (逃离左边作为读者的练习: - ))。

答案 1 :(得分:10)

./program < input语法是一种特殊的shell语法,说“将名为input的文件中的所有内容重定向到程序的标准条目”。

要阅读输入,您的程序只需使用标准输入读取功能,行fgetsscanf

答案 2 :(得分:5)

在* nix系统上, 不会是argv的第三个元素。如果你在几乎任何类Unix的shell上执行该命令,它将类似于这样做:

cat input | ./program

因此,./program argv中只有一个元素,但stdin是文件input,所以要读取{{1}中的文件}}。请注意,这是设计程序的完美有效方法。如果没有给出文件,许多Unix程序都会从​​标准输入读取,这样你就可以输入其他程序的输入(或者在这种情况下,来自文件)。

答案 3 :(得分:3)

<之后的内容不是命令行参数。该文件的内容将由shell传送到您的程序中。

您需要做的就是从标准输入读取,您将获得该文件的内容。

答案 4 :(得分:3)

你需要转义'&lt;',否则shell会解析它,程序不会在命令行中接收它。

如果你正在使用bash,那么:

./program '<' input

./program \< input

其他shell可能采用不同的方式(例如,Windows默认为cmd.exe,使用^作为转义字符,而不是\)。

答案 5 :(得分:0)

这是一个Unix shell的东西。表单someprogram < somefile告诉someprogram使用somefile作为输入运行。如果你想做一些涉及<符号的不同的事情,你需要引用它。

答案 6 :(得分:0)

<表示程序将从命名文件(输入)读取标准输入(stdin)。所以只需从标准输入读取(使用fgetsfread等)。

答案 7 :(得分:0)

不要'&lt;'。您希望命令行参数执行此操作:

  

$ ./program -Dflag seven = ixnay FromDinger

在您的应用程序中,试试这个:

int main( int argc, char **argv )
{
   int i;
   for( i = 0 ; i < argc ; ++i )
      printf( "Arg %d = %s\n", i, argv[i] );
   return 0;
}

您会注意到第一个参数是可执行文件的名称(在索引0处),而您的第二个参数(在索引1处)将是“-Dflag”

答案 8 :(得分:0)

实际上,这是编程锦标赛中常用的一种技术。程序所需的数据存储在一个文件中,比方说data.txt,然后使用“&lt;”重定向到您的应用程序。在shell上,像这样: ./ program&lt; data.txt中

因此,在您的源代码中,您需要做的是这样的事情:

#include <iostream>
#include <string>

using namespace std;

int main(void)
{
    string tmp;
    string full_content;

    while (cin >> tmp)
        full_content += " "+tmp;

    cout << full_content << endl;
}

..你将从字符串中获取文件中的所有数据(并用空格分隔)。

这是一种方法,我希望它有所帮助。 []的

答案 9 :(得分:-2)

你可以通过阅读stdin来获得它。