【问题标题】:How can I read from stdin with this specific command?如何使用此特定命令从标准输入读取?
【发布时间】:2021-09-01 12:26:09
【问题描述】:

我是 C 的新手,我想知道我的程序需要什么,以便在将这个命令写入控制台时,它能够从给定的 test.stdin 文件中读取:

cat test.stdin | ./myprogram | tee myoutput.stdout

?

所以我猜 test.stdin 是计算机上的某个文件,它为我的程序提供数据/输入,然后我的程序正在处理该数据并将结果写入文件 myoutput.stdout,该文件也在我的某个地方电脑。

我的程序需要什么才能使上面的命令正常工作?我需要对 stdin 中的数据进行一些计算,但我不知道如何开始,如何读取并让命令适用于我的程序。

【问题讨论】:

  • 标准输入是标准输入。不应该做任何特别的事情,只需像往常一样从标准输入中读取。
  • @MikeCAT 我已经读到可以使用 fopen 函数从标准输入读取,这是正确的吗?如果是,我不知道这个函数的参数需要是什么,所以上面的命令才能工作。我认为像 fopen(somestdin, "r");会失败,因为我的程序不知道 somestdin 应该是什么?
  • 如果您的系统支持 "/dev/stdin" 可能会起作用,但您不需要使用它,只需从标准输入中读取即可。
  • 当您使用管道时,来自stdin 的正常读取将从管道中读取。您可以照常使用scanffgets 等普通函数。

标签: c bash unix command-line


【解决方案1】:

正如@MikeCAT 所说,您可以直接阅读stdin,但作为初学者,您可能不知道如何做到这一点。您可以使用 getcharfgetsscanf 等等。无需“打开”stdin,因为它默认为任何 C 程序打开,stdoutstderr 也是如此。如果您在 Linux 上运行,您可以使用 man... 即 man getchar 了解各种输入功能的用法。如果你不在 Linux 上,你可以做一个google search

【讨论】:

  • 函数 gets() 几年前从 C 语言中删除了。如果你在程序中使用它,你的编译器应该警告你。 IE。不推荐使用gets()
  • 对不起,@user3629249,你是对的。我自己很少使用这些,以至于我忘记了。我会改变我的答案。
【解决方案2】:

在 C 中,从“标准输入”或stdin 读取是默认设置。这是最简单的事情。您不必显式打开任何内容;在您的 main 函数被调用之前,stdin 始终为您打开(以及 stdoutstderr)。

您可以阅读stdin 的各种标准库函数。最常见的是getcharscanf。而且,重复一遍:如果你愿意,你可以在main 的第一行开始打电话给他们。他们立即工作;无需设置步骤。

getchar 读取一个字符。
scanf 读取“格式化输入”,虽然这个函数充满了问题和陷阱,以至于几乎不值得使用。

stdin 中读取一行,该函数曾经是gets,尽管它有一个致命的问题并且已从语言中删除。今天,要从stdin 中读取一行,一种方法是使用fgets 函数,它实际上可以从任何流中读取行,因此您必须将stdin 作为其fp 参数显式传递。

【讨论】:

    【解决方案3】:

    stdout(标准输出)是程序可以发送到的地方 信息(例如,文本)。程序永远不知道信息在哪里 它发送到标准输出正在运行。信息可以转到 打印机、普通文件或终端(屏幕)。默认情况下外壳 将命令的标准输出定向到终端(屏幕)并描述 如何使 shell 将此输出重定向到另一个文件。

    stdin(标准输入)是程序从中获取信息的地方;经过 默认情况下,shell 直接从键盘输入标准输入。 与标准输出一样,程序永远不会“知道”信息在哪里 来自。以下部分解释了如何重定向标准输入 到一个命令,所以它来自一个普通文件而不是来自 键盘。

    您可以使 shell 重定向标准输入或标准输出 通过将输入或输出与命令或文件相关联的任何命令 除了代表键盘的设备文件或 终端(屏幕)。

    cat 实用程序提供了一个很好的例子来说明键盘和 终端(屏幕)作为标准输入和标准输出, 分别。运行 cat 时,它会将文件复制到标准输出。 因为 shell 将标准输出定向到屏幕,所以 cat 显示 屏幕上的文件。

    cat 写入标准输出,不一定是 终端, 即使 cat 是作为交互式 shell 命令的一部分输入的。如果 你真的需要一些东西来写到终端,即使标准 输出被重定向,这并不容易(您需要指定哪个 终端,如果从终端执行命令,甚至可能没有终端 一个脚本)

    【讨论】:

      猜你喜欢
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      相关资源
      最近更新 更多