【问题标题】:Command line C with '<' and '- option'带有 '<' 和 '- option' 的命令行 C
【发布时间】:2014-02-17 07:02:06
【问题描述】:

只是一个关于 C 中命令行内容的简单问题。

下面是什么意思?我知道 -a 是可执行测试的一个选项。 测试-a

但是“

另外,如果你们能帮助我了解一个简单的程序如何接受以下选项 '-a, -b, -c' 作为三个不同的选项,这会很有帮助。在我看来,这样做的方法似乎只是检查该参数是否有 2 个字符,并且它只是一个 '-' 后跟一个有效选项的字母,但是有什么特殊的方法可以做到这一点吗?就像 C 中的某些东西会自动将“-”后跟一个字母识别为选项之类的东西?

【问题讨论】:

标签: c command-line-arguments


【解决方案1】:

在 C 中它没有什么特别的意思,只是命令行上的一个“

在许多操作系统中,这意味着从文件 test.txt 重定向标准输入。 IE。它不是来自终端的标准输入,而是来自命名文件。

要为您处理命令行解析,请查看getopt

我将此作为评论添加,但我认为它应该出现在答案中:

如果您输入app -a -b &lt; xxx,调用您的应用程序的shell 会解释该行的&lt; xxx 部分,并且&lt; xxx 不会出现在传递给您的应用程序的args (argv) 数组中。您没有(简单的)方法知道重定向已经发生。

【讨论】:

  • 这是否意味着它会从该文件中提取所有参数?如果我在那个文本文件中有类似“The quick brown fox”之类的内容,它会如何阅读?
  • 如果您的程序正在执行scanf 或类似的操作,它来自文件,而不是您在终端输入 intp。文件 IO 仍然是文件 IO - 如果您正在打开要读取的文件,那么重定向不是您想要的。
  • 等等,我很困惑。 test
  • 如果您输入“app -a -b
  • 那么我如何在我的应用程序中实际读取“xxx”中的内容?你能举出任何例子来说明它的用途吗?我是否只是将其视为另一个输入流?
【解决方案2】:

我想澄清一下 John3136 和 enedil 到目前为止所说的话。我希望你接受其中一个答案。

shell(例如,bash)是负责处理您键入的命令并执行相应程序的程序。 sn -p &lt; test.txt 是一个特殊指令,它指示 shell 让程序从文件(在本例中为 text.txt)读取其输入。正如 enedil 指出的那样,不是指令的词通过变量 argv 作为参数传递给 C 程序。

编辑。有两种方法可以将文件传递给程序。

在运行时提供文件路径作为参数。然后可以调用fopen打开指定文件:

if (argc == 1) {
    fprintf("No filename provided!");
    exit(EXIT_FAILURE);
}
FILE* f = fopen(argv[1], "r");
/* Do stuff with f here */

另一种选择是在 C 程序中从 stdin 读取您的输入,并在您想将文件的内容用作 stdin 时使用 &lt; test.txt 重定向文件。这样,您可以通过允许程序从文件读取输入或接收用户输入来提供更大的灵活性。

【讨论】:

  • 那么你能帮我理解如果我想阅读 test.txt 的内容,我将如何用 C 来做呢?
  • 这在很大程度上取决于您要做什么,我会将其编辑为答案。
  • 好的,如果 test.txt 被这样重定向,我可以打开它吗?我了解如何使用 fopen 和 fscanf,但我对命令行参数和重定向输入之间的差异感到困扰,因为我编写了一个程序,其中包含一个文件名以在其中打开 fopen。
【解决方案3】:

”,它会将程序的输出重定向到 test.txt。

我认为没有一种特殊的方法可以检测“-”。遍历参数并检查第一个字符是否为“-”

【讨论】:

  • 关闭,但不正确。在大多数 shell 中,foo &lt; bar.txt 将 bar.txt 的内容通过管道传输到 foo 的 stdin
猜你喜欢
  • 2011-05-29
  • 1970-01-01
  • 2011-07-30
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2012-06-06
  • 1970-01-01
相关资源
最近更新 更多