05-重定向
17.1.3 重定向
标准输入和输出流通常连接着键盘和屏幕。但很多操作系统(包括UNIX、Linux和Windows)都支持重定向,这个工具使得能够改变标准输入和标准输出。例如,假设有一个名为counter.exe的、可执行的Windows命令提示符C++程序,它能够计算输入中的字符数,并报告结果(在大多数Windows系统中,可以选择“开始”>“程序”,再单击“命令提示符”来打开命令提示符窗口)。该程序的运行情况如下:
C>counter
Hello
and goodbye!
Control-Z << simulated end-of-file
Input contained 19 characters.
C>
其中的输入来自键盘,输出的被显示到屏幕上。
通过输入重定向(<)和输出重定向(>),可以使用上述程序计算文件oklahoma中的字符数,并将结果放到cow_cnt文件中:
cow_cnt file:
C>counter <oklahoma >cow_cnt
C>
命令行中的<oklahoma将标准输入与oklahoma文件关联起来,使cin从该文件(而不是键盘)读取输入。换句话说,操作系统改变了输入流的流入端连接,而流出端仍然与程序相连。命令行中的>cow_cnt将标准输出与cow_cnt文件关联起来,导致cout将输出发送给文件(而不是屏幕)。也就是说,操作系统改变了输出流的流出端连接,而流入端仍与程序相连。DOS、Windows命令提示符模式、Linux和UNIX能自动识别这种重定向语法(除早期的DOS外,其他操作系统都允许在重定向运算符与文件名之间加上可选的空格)。
cout代表的标准输出流是程序输出的常用通道。标准错误流(由cerr和clog代表)用于程序的错误消息。默认情况下,这3个对象都被发送给显示器。但对标准输出重定向并不会影响cerr或clog,因此,如果使用其中一个对象来打印错误消息,程序将在屏幕上显示错误消息,即使常规的cout输出被重定向到其他地方。例如,请看下面的代码片段:
if (success)
std::cout << "Here come the goodies!\n";
else
{
std::cerr << "Something horrible has happened.\n";
exit(1);
}
如果重定向没有起作用,则选定的消息都将被显示在屏幕上。然而,如果程序输出被重定向到一个文件,则第一条消息(如果被选定)将被发送到文件中,而第二条消息(如果被选定)将被发送到屏幕。顺便说一句,有些操作系统也允许对标准错误进行重定向。例如,在UNIX和Linux中,运算符2>重定向标准错误。