首先让我说这与家庭作业有关。然而,这是任务中非常小且相对微不足道的部分。
C 程序通过命令行参数接收输入,但它需要采用以下形式:
$ ./program < input
怎么样,我会以字符串的形式接收该输入吗?每次我尝试从 argv 打印第三个参数时,我都会收到以下消息:
输入:没有这样的文件或目录。
首先让我说这与家庭作业有关。然而,这是任务中非常小且相对微不足道的部分。
C 程序通过命令行参数接收输入,但它需要采用以下形式:
$ ./program < input
怎么样,我会以字符串的形式接收该输入吗?每次我尝试从 argv 打印第三个参数时,我都会收到以下消息:
输入:没有这样的文件或目录。
< 是一个 shell 重定向 - 它在您的程序之外处理。您将看到文件名“输入”的内容被发送到您的标准输入流。这是程序运行的一种常见方式,尽管它们通常也处理被赋予文件名的情况,例如sed
.
如果我不得不猜测,我会认为:
input: No such file or directory.
来自外壳,因为它无法打开指定的文件:“输入”。
另一方面,如果你真的想要< input
程序的 as 参数,你可以转义或引用它们,这样 shell 就不会解释它们。(转义为读者的练习:-))。
该./program < input
语法是一种特殊的 shell 语法,表示“将文件中的所有内容重定向input
到程序的标准条目”。
要读取输入,您的程序只需使用标准输入读取函数 linefgets
或scanf
.
在 * nix系统上,不会有argv
. 如果您在几乎任何类 Unix 的 shell 上执行该命令,它将类似于执行此操作:
cat input | ./program
所以你./program
只有一个元素argv
,但它stdin
是文件input
,所以要读取你刚从中读取的文件stdin
。请注意,这是设计程序的一种完全有效的方法。如果没有给出文件,许多 Unix 程序会从标准输入中读取,这样您就可以通过管道输入来自其他程序(或者在这种情况下,来自文件)的输入。
后面的<
不是命令行参数。文件的内容将通过 shell 传送到您的程序中。
您需要做的就是从标准输入读取,您将获得文件的内容。
您需要转义 '<',否则 shell 会解析它,并且程序不会在命令行中接收它。
如果您使用的是 bash,那么:
./program '<' input
或者
./program \< input
其他 shell 可能会以不同的方式执行此操作(例如,Windows 的默认值 ,cmd.exe
用作^
转义字符,而不是\
)。
这是一个 Unix shell 的东西。该表单someprogram < somefile
告诉 someprogram 使用 somefile 作为其输入来运行。如果你想做一些涉及<
符号的不同的事情,你需要引用它。
这<
意味着程序将从命名文件(输入)中读取它的标准输入(stdin)。所以只需从标准输入读取(使用fgets
,fread
等)。
去掉'<'。您希望命令行参数执行以下操作:
$ ./program -Dflag 七=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”
实际上,这是编程比赛中使用的一种非常常见的技术。您的程序需要的数据存储在一个文件中,比如说 data.txt ,然后使用 shell 上的“<”重定向到您的应用程序,如下所示:./program < 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;
}
..您将从文件中的字符串中获取所有数据(并以空格分隔)。
这是一种方法,我希望它有所帮助。[]的
您可以通过阅读标准输入来获得它。