【问题标题】:Redirection operator vs file handling重定向运算符与文件处理
【发布时间】:2012-03-02 21:48:01
【问题描述】:

在为符合 POSIX 的操作系统编写一个接受输入并产生输出的简单程序时,何时以及为什么应该这样做

myprogram file.in

优先考虑

myprogram < file.in

反之亦然?

我喜欢后者,因为我觉得文件处理应该是 shell 的责任,而不是我的程序。另一方面,我不太确定相同的代码如何适用于文件和标准输入——标准输入不应该是交互式的,即提示您输入吗?而在文件中,格式是可以理解和预定义的,例如有一个整数是输入值(在这种情况下 another 选项将简单地接受该值作为命令行参数),或者每一行都包含一个测试用例,它是一个空格列表- 分隔数字等。

例子会很棒。

请注意,我已经看过 Shell redirection vs explicit file handling code,但没有一个答案能在一般意义上真正回答这个问题。

【问题讨论】:

  • 绝对没有理由期望标准输入是交互式的。做出这样的假设会给很多人带来麻烦,并导致很多软件的用处远不如应有的那么好。
  • @WilliamPursell:那么您会说对文件进行重定向,并将标准输入视为文件(没有交互式提示)吗?我只是在想,如果程序接受两个数字然后执行某些操作,则在您按两次 Enter 之前不会发生任何事情,而对于已经存在的文件,如果文件格式不正确,则可以显示错误消息.
  • @Mk12 :您的程序实际上可以区分交互和阅读重定向stdin 之间的区别。检查程序bc - 在命令行输入bc,它是交互式的。输入3 + 7 回车,它会显示10Ctrl+D 退出。现在创建一个包含 1 行的文件 3 + 7 并运行 bc &lt; myfile

标签: file unix input posix stdin


【解决方案1】:

这取决于偏好,您的程序的预期用途应告知您的决定。

UNIX philosophy 建议编写通过干净接口连接的简单工具。创建一个接受标准输入的工具将使其更加通用。您将能够从现有文件或任何其他 POSIX 命令的输出中提供该工具。

【讨论】:

    【解决方案2】:

    如果在命令行中给出了一个文件,大多数 POSIX 实用程序将作用于一个文件,如果没有指定文件,则作用于 stdin/stdout。常见的样式有

    • myprogram filename
    • myprogram -f filename
    • myprogram --file=filename

    或可指定单独的输入和输出。

    这允许灵活地提供文件,或者使用重定向或流水线。

    main 处理参数并在必要时打开文件,然后将打开的文件流(无论是来自stdin 还是您打开的文件)传递给您的处理函数。

    正如 sgmorrison 所提到的,这符合 UNIX 哲学。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 2015-02-07
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多