转载百度知道:https://zhidao.baidu.com/question/513394569.html
什么电脑外设控制,磁盘文件输入输出,只要是输入或者输出所产生的数据都是流。
从linux对于硬件设备的控制很容易看出,对于硬件和磁盘上的文件,C语言的操作方法基本上一样。linux中C语言也是把硬件当做文件进行操作。(本质上,它把外设与txt文本文件看成一类东西。)流的概念的提出,我认为是为了程序对于文本和硬件的一系列操作而设定的统一标准。从程序员角度来看,就不需要知道各个操作的细节,编程的时候,统一把外设都当成文件进行操作就OK了。比如对于声卡,先OPEN打开,然后write写入,就完成喇叭发声,然后close关闭。和对于文本操作基本一样。
不管对设备或是文件(广义上都是文件)的输入输出操作,而产生的数据,都是I/O流。而C语言中的I/O流能分为两种:文本流,二进制流。很容易看出文本流控制很二进制流控制的区别。你用TC,fopen打开一个MP3或者别的32位文件,然后读取,会发现用文本流打开后,文件只能读到开头一点点。因为32位音乐文件有很多的'00'数据,文本流会把它当做文件结束符而结束读取。而二进制流打开方式则可以从头读到尾。(这时候输出的时候可能存在点问题,实验的时候可以用二进制 流方式再写入到另外一个文件来观察。)
流是由输入输出产生的,是用于数据交换或转换的统一的标准(特指这一类的数据)。C++和一些编程语言中定义的流(stream)类,就是对这类数据的定义。并通过成员函数对“流”进行操作。这样,用户和程序,程序和外设之间都是通过“流”进行交互。而程序员不需要知道“流”的底层到底是怎么实现的。 就好像吃饭和排泄。数据流中定义了,先牙齿咀嚼,然后胃部消化,然后小肠吸收,然后大肠发酵,然后你懂的。你只需要CIN,还有COUT,就能控制吃喝拉撒。你管它是细嚼还是狼吞?你管它便秘还是拉肚子?吞吐量是电脑性能的事。你管它是先进小肠还是先进胃?底层是内核的事。你只需要拥有了CIN和COUT,你就拥有了一切。
从广义上来说,流也是文件,不同于txt文本类的文件(流属于数据,数据等同于文件)。你可以对流进行各种操作。缓冲区的定义,也是为了对流的操作。
转载博客:http://www.cnblogs.com/corvoh/p/5596534.html
stdout, stdin, stderr的中文名字分别是标准输出,标准输入和标准错误。在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据流。什么是数据流呢(stream)?我们知道,一个程序要运行,需要有输入、输出,如果出错,还要能表现出自身的错误。这是就要从某个地方读入数据、将数据输出到某个地方,这就够成了数据流。
因此,一个进程初期所拥有的这么三个数据流,就分别是标准输出、标准输入和标准错误,分别用stdout, stdin, stderr来表示。对于这三个数据流来说,默认是表现在用户终端上的,一般stdout, stderr被定位到屏幕。比如我们在c中使用fprintf:fprintf(stdout,"hello world!n");屏幕上将打印出"hello world!"来。stdin被定位到键盘。当然他们也可以重新定位。
流的重定向
实现函数:FILE *freopen(const char *filename,const char *type, FILE *stream);此函数一般用于将一个指定的文件打开一个预定义的流:标准输入、标准输出或者标准出错。
这个例子实现了从stdout到一个文本文件的重定向。即,把输出到屏幕的文本输出到一个文本文件中。
#include <stdio.h>
int main()
{
int i;
if (freopen("D:OUTPUT.txt", "w", stdout)==NULL)
fprintf(stderr, "error redirectingstdout
");
for(i=0;i<10;i++)
printf("%3d",i);
printf("
");
fclose(stdout);
return 0;
}