Logo
Section 1 / 6

重定向标准输入和输出流

在本节课中,我们将学习如何将程序的标准输入和输出重定向到文件,或将其管道传递给其他程序。

导入

重定向标准输入和输出流

在本节课中,我们将学习如何将程序的标准输入和输出重定向到文件,或将其管道传递给其他程序。

我们迄今为止看到的所有程序都是通过 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 都提供的实用工具。


下一课将深入探讨文件处理的概念,包括如何创建文件、从文件读取数据以及向文件写入数据。

数组、字符和字符串

文件