Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 重定向操作符与文件处理_File_Unix_Input_Posix_Stdin - Fatal编程技术网

File 重定向操作符与文件处理

File 重定向操作符与文件处理,file,unix,input,posix,stdin,File,Unix,Input,Posix,Stdin,当为POSIX兼容操作系统编写一个接受输入并产生输出的简单程序时,何时以及为什么应该这样做 myprogram file.in 被优先考虑 myprogram < file.in myprogram

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

myprogram file.in
被优先考虑

myprogram < file.in
myprogram
反之亦然

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

举个例子就好了


请注意,我已经看到了,但没有一个答案真正从一般意义上回答了这个问题。

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


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

这取决于您的首选项,您的程序的预期用途应告知您的决定


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

如果命令行中给出了一个文件,则大多数POSIX实用程序将对该文件起作用;如果未指定任何文件,则对stdin/stdout起作用。常见的样式是

  • myprogram文件名
  • myprogram-f文件名
  • myprogram--file=filename
或可指定的单个输入和输出

这允许灵活地提供文件,或使用重定向或管道

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


正如sgmorrison所提到的,这符合UNIX的原理。

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

  • myprogram文件名
  • myprogram-f文件名
  • myprogram--file=filename
或可指定的单个输入和输出

这允许灵活地提供文件,或使用重定向或管道

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


正如Morrison所提到的,这符合UNIX的理念。

完全没有理由期望stdin是交互式的。做出这样的假设会让很多人陷入麻烦,并导致许多软件远没有它应有的用处。@williampersell:那么你会说对文件进行重定向,并将stdin当作一个文件(没有交互提示)来对待吗?我只是在想,如果程序接受两个数字,然后做一些事情,在你按两次enter键之前什么都不会发生,而对于一个已经存在的文件,如果文件格式不正确,您可以显示一条错误消息。@Mk12:您的程序实际上可以区分交互和读取重定向的
stdin
。在命令行中检查程序
bc
-键入
bc
,它是交互式的。键入
3+7
点击回车键,显示
10
Ctrl+D
退出。现在创建一个文件,其中一行写着
3+7
,然后运行
bc
,完全没有理由期望stdin是交互式的。做出这样的假设会让很多人陷入麻烦,并导致许多软件远没有它应有的用处。@williampersell:那么你会说对文件进行重定向,并将stdin当作一个文件(没有交互提示)来对待吗?我只是在想,如果程序接受两个数字,然后做一些事情,在你按两次enter键之前什么都不会发生,而对于一个已经存在的文件,如果文件格式不正确,您可以显示一条错误消息。@Mk12:您的程序实际上可以区分交互和读取重定向的
stdin
。在命令行中检查程序
bc
-键入
bc
,它是交互式的。键入
3+7
点击回车键,显示
10
Ctrl+D
退出。现在创建一个文件,其中一行写着
3+7
,然后运行
bc