【问题标题】:Reading command line arguments after '<' in C在 C 中的“<”之后读取命令行参数
【发布时间】:2010-12-02 09:43:07
【问题描述】:

首先让我说这与家庭作业有关。然而,这是作业中非常小且相对微不足道的部分。

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

$ ./program < input

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

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

【问题讨论】:

    标签: c command-line-arguments


    【解决方案1】:

    实际上,这是在编程比赛中使用的一种非常常见的技术。您的程序需要的数据存储在一个文件中,比如说 data.txt ,然后使用 shell 上的“./program

    所以,在你的源代码中,你需要做的是这样的:

    #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;
    }
    

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

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

    【讨论】:

      【解决方案2】:

      去掉'

      $ ./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”

      【讨论】:

        【解决方案3】:

        sed.

        如果我不得不猜测,我会认为:

        input: No such file or directory.
        

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

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

        【讨论】:

        • 伊斯特伍德先生,你拍得真好。
        【解决方案4】:

        &lt; 表示程序将从指定文件 (input) 中读取它的标准输入 (stdin)。所以只需从标准输入读取(使用fgetsfread 等)。

        【讨论】:

          【解决方案5】:

          这是一个 Unix shell 的东西。 someprogram &lt; somefile 形式告诉 someprogram 使用 somefile 作为其输入来运行。如果您想做一些涉及&lt; 符号的不同操作,则需要引用它。

          【讨论】:

            【解决方案6】:

            你可以通过阅读标准输入来获得它。

            【讨论】:

              【解决方案7】:

              你需要对'

              如果你使用的是 bash,那么:

              ./program '<' input
              

              ./program \< input
              

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

              【讨论】:

                【解决方案8】:

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

                要读取输入,您的程序只需使用标准输入读取函数,行fgetsscanf

                【讨论】:

                • "要读取输入,您的程序只需要使用标准输入读取函数,fgetsscanf 行。" 具体来说,在stdin 流上.
                • @T.J. scanf() 还对什么其他流进行操作? :P
                【解决方案9】:

                在 *nix 系统上,argv 不会有第三个​​元素。如果您在几乎任何类 Unix 的 shell 上执行该命令,它将类似于执行此操作:

                cat input | ./program
                

                所以您的./programargv 中只有一个元素,但它的stdin 是文件input,所以要读取文件,您只需从stdin 读取。请注意,这是设计程序的一种完全有效的方法。如果没有给出文件,许多 Unix 程序会从标准输入中读取,这样您就可以通过管道输入来自其他程序(或者在这种情况下,来自文件)的输入。

                【讨论】:

                • 不仅在 *nix 系统上。 DOS/Windows 和 OS/2 以同样的方式处理这个问题。顺便说一下,用 '|' 解释 '
                • 它可能不会立即变得更明显,但它确实更清楚地表明./program 没有被赋予任何参数。
                • 这实际上不适用于 DOS——在 DOS 中,整个命令行(带有重定向)被传递给程序,它负责打开文件等。当然,如果你使用 C 编译器,在 main 之前运行的编译器的启动例程会为你做这些......
                【解决方案10】:

                &lt; 之后的不是命令行参数。该文件的内容将通过 shell 传送到您的程序中。

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

                【讨论】:

                  猜你喜欢
                  • 2011-07-06
                  • 2019-02-07
                  • 1970-01-01
                  • 2016-01-28
                  • 1970-01-01
                  • 2021-01-05
                  • 2022-11-20
                  • 2017-03-18
                  • 1970-01-01
                  相关资源
                  最近更新 更多