重定向标准输入和输出流
在本节课中,我们将学习如何将程序的标准输入和输出重定向到文件,或将其管道传递给其他程序。
我们迄今为止看到的所有程序都是通过 stdin 和 stdout(标准输入和输出流)进行交互的。像 readf 和 writeln 这样的输入输出函数,默认情况下就是操作这些流。在使用这些流时,我们假设标准输入来自键盘,而标准输出则输出到屏幕。
我们将从下一课开始学习如何处理文件。我们会发现,与标准输入输出流类似,文件也是字符流,其使用方式几乎与 stdin 和 stdout 相同。但在了解程序如何访问文件之前,我们先来熟悉一下如何将程序的标准输入和输出重定向到文件,或者将其输出通过管道传递给其他程序。
使用 > 将标准输出重定向到文件
在终端中运行程序时,在命令行末尾添加一个 > 字符和文件名,即可将该程序的标准输出重定向到指定文件。程序原本输出到标准输出的内容,现在都会写入这个文件。
我们用一个程序来测试:该程序从输入读取一个浮点数,将其乘以 2,然后将结果输出到标准输出:
1import std.stdio; 2 3void main() { 4 double number; 5 readf(" %s", &number); 6 7 writeln(number * 2); 8}
假设程序名为 by_two,当我们在命令行中运行以下命令时,输出将被写入名为 by_two_result.txt 的文件:
1./by_two > by_two_result.txt
例如,如果在终端输入 1.2,那么结果 2.4 就会出现在 by_two_result.txt 文件中。
注意:尽管程序没有显示类似“请输入一个数字”的提示,但它仍然期望用户输入一个数值。
使用 < 将标准输入从文件重定向
与使用 > 重定向标准输出类似,也可以使用 < 操作符将标准输入重定向为从文件读取。此时,程序不再从键盘读取输入,而是从指定文件中读取数据。
为了测试这一点,我们使用一个计算某个数十分之一的程序:
1import std.stdio; 2 3void main() { 4 double number; 5 readf(" %s", &number); 6 7 writeln(number / 10); 8}
假设文件 by_two_result.txt 仍然存在,并且包含上一次输出的值 2.4,而新程序的名称是 one_tenth,我们可以这样将该程序的标准输入重定向到该文件:
1./one_tenth < by_two_result.txt
这次程序会从 by_two_result.txt 读取数据,并在终端显示结果 0.24。
同时重定向两个标准流
> 和 < 操作符可以同时使用:
1./one_tenth < by_two_result.txt > one_tenth_result.txt
此时,标准输入从 by_two_result.txt 读取,标准输出则写入 one_tenth_result.txt。
注意:
by_two_result.txt在两个程序之间起到了中间媒介的作用——by_two将数据写入该文件,而one_tenth从中读取数据。
使用 | 管道连接程序
| 操作符可以将左侧程序的标准输出直接传递给右侧程序的标准输入,无需借助中间文件。例如,将前面提到的 by_two 和 one_tenth 两个程序通过管道连接起来,它们共同实现对输入值的五分之一计算:
1./by_two | ./one_tenth
首先,by_two 从输入读取一个数字;然后,它将结果写入标准输出。这个结果会作为 one_tenth 的标准输入,后者再计算出该值的十分之一,并将其写入自己的标准输出。
注意:即使不修改现有程序的源代码,也可以让它们将输出写入文件而非屏幕,或将输入从文件读取而非键盘。虽然这些功能与编程语言本身无直接关系,但它们是几乎所有现代 shell 都提供的实用工具。
下一课将深入探讨文件处理的概念,包括如何创建文件、从文件读取数据以及向文件写入数据。