需要非扫描版高清pdf请私信我哦~
标准输入、标准输出和标准错误
程序运行时,操作系统会创建标准输入、标准输出和标准错误,它会把标准输入指向键盘,把从标准输出和标准错误读到的数据发送到显示器。
![](https://img-blog.csdnimg.cn/20200422141725128.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpbnhpYW9xaW5nMQ==,size_16,color_FFFFFF,t_70#pic_center)
scanf() 和 printf() 这两个函数就是用了标准输入和标准输出,从键盘读取数据,并向显示器写数据。它们并没有直接使用键盘和显示器,是操作系统控制数据如何进出标准输入、标准输出。如果在命令提示符或终端运行程序,操作系统会把所有键盘输入都发送到标准输入;默认情况下,如果操作系统从标准输出中读到数据,就发送到显示器。
fprintf():printf() 函数可以将数据发送到标准输出,但 printf() 其实只是一个函数的特例,而这个函数叫 fprintf() 。fprintf() 函数可以让你决定把文本发送到哪里,你既可以让 fprintf() 把文本发送到 stdout(标准输出),也可以发送到 stderr(标准错误)。
fscanf():既然有 stdout 和 stderr,自然有 stdin,它代表标准输入。scanf() 可以从标准输入读取数据,它是由 fscanf() 实现的。它们用法很像,区别是可以指定 fscanf() 从哪条数据流中读数据。
重定向
scanf() 和 printf() 函数并不知道数据从哪里来,也不知道数据要到哪里去,它们也不关心这点,它们只管从标准输入读数据,向标准输出写数据。为什么不让程序直接使用键盘和屏幕呢?岂不是更简单?操作系统为什么要使用标准输入、标准输出与程序交互呢?有一个很好的原因:因为这么一来,就可以重定向标准输入、标准输出,让程序从键盘以外的地方读数据、往显示器以外的地方写数据,例如文件。
可以用 < 重定向标准输入,用 > 重定向标准输出,2>重定向标准错误。例如:
> ./geo2json < gpsdata.csv > output.json 2> errors.txt
用管道连接输入与输出
如果我们想在 geo2json 小工具的基础上给它添加一些额外功能,为了能够保证其独立性,我们不能修改原有工具,而是创建一个新的 bermuda 工具。要把bermuda工具的标准输出连接到geo2json工具的标准输入。
符号 | 表示管道(pipe),它能连接一个进程的标准输出与另一个进程的标准输入。操作系统会处理管道的细节,我们要做的就是输入一条这样的命令:
(./bermuda | ./geo2json) < spooky.csv > output.json
创建自己的数据流
程序运行时,操作系统会为它创建三条数据流:标准输入、标准输出和标准错误。但有时你需要创建自己的数据流。好在操作系统没有规定只能使用它分配的三条数据流,你可以在程序运行时创建自己的数据流。每条数据流用一个指向文件的指针来表示,可以用 fopen() 函数创建新数据流。
FILE *in_file = fopen("input.txt", "r");
FILE *out_file = fopen("output.txt", "w");
最后,当用完数据流,别忘了关闭它。虽然所有的数据流在程序结束后都会自动关闭,但你仍应该自己关闭它们:
fclose(in_file);
fclose(out_file);