流是磁盘或其它外围设备中存储的数据的原点或终点。流主要是指一种逻辑上的概念,它提供或存储数据。产生数据的叫输入流,消耗数据的叫输出流。至于怎么产生,又怎么消耗,这是一种物理上的实现,根据每种设备有所不同。对于流的使用者不用关心太多细节。体现了计算机的核心思想对复杂的东西抽象化。c语言中对IO流的不同角度有不同划分。有诸多形象的例子,比如设备与文件直接传输过程就像一个房间里放着一块冰,一个房间需要用水;那么最简单的方式就是融合它,以水的方式流过去。
     流的分类:1.按照流向分为输入流和输出流。
                   2.按照数据的表现形式分为:字节流(二进制,可以处理一切文件,文本,音频等)和字符流(文本文件,只能是纯文本,像txt)
     文本流:文本流的特点是流由文本行组成,每一行由0个或多个字符并以'\n'结束,即它是有一定意义的,以某种字符集的字符组成的一个序列。一个文本流,读入与写出时可能   会对其内容做更改,因为它是有一定意义的,系统可以识别并在适当时候解释,比如在输出文本流中遇到'\b'时,系统的操作是将输入流中的前一个字符删除,在终端上显示就是在它前面输出的这个字符被删除了。
     二进制流:二进制流完成由一些“生”的,未经处理的数据组成的,c语言将它们看成由0与1组成的序列来读与写,所以它们的特性是同一系统中把同一二进制流读入与写出,其内容没有任何变化。这里区分了文本流和二进制流可以看出它们有诸多不同的地方。其实说白了,文本流人家有样式,穿衣服。进cpu洗澡的时候,要有人脱衣服,出来的时候也有人穿衣服,有人给打扮。而二进制文本就是裸着,出进倒是方便了。文本文件是为人类使用设计的,像你的txt。而二进制的流是计算机使用的,像你编译完的程序。
       下面我们以图的形式来区分文本流和二进制流  
        文本文件: 在磁盘中存放时,每个字符对应一个字节,用于存放相对应的ASCII码。故亦可称作ASCII码文件。
                 例如:十进制整数5678在文本文件中的存储形式为:
                                00110101          00110110              00110111      00111000    
                                                                           
                                 “5”                  “6”                    “7”               “8”
       文本文件的特点:占存储空间较多,系统需在对数据I/O操作时将5678文本文件存储格式转换为二进制,耗费时间。
       
      二进制文件:按二进制的编码方式存放文件
      示例:十进制整数5678在二进制文件中的存储形式
                    0001011000101110
在IO流中输入输出分为4步:格式化/解析,缓冲,编码转换和传递。
格式化/解析:在内部数据表示(以字节为单位)与外部数据表示(以字符为单位)之间进行双向转换。例如一个2字节的整数10002,就需要5个字符来表示。
缓冲:用于在格式/解析与传递之间缓存字符序列。对于输出,较短的字符序列格式化之后并不马上输出,而是保存在缓冲区里,待积累到一定规模之后再传递到外部设备。相反,从外部设备读入的大量数据也是先放在缓冲区,然后逐步取出完成输入。默认时,IO流的输入输出都是经过缓冲的,也可以将IO流工作在无缓冲模式。
编码转换:将一种字符表达式转换成另一种字符表达式。如果格式化产生的字符表达式与外部字符表达式不同(输出时),或则外部表达式与IO流能解析的表达式不同(输入时),就必须进行编码转换。如多字节编码与宽字符编码之间的转换等。多数情况下并不需要编码转换。
传递:主要是与外部设备进行通信。输出时,传递负责将经过格式化、缓冲即编码转换后字符序列发送到外部设备;输入时,则负责外部设备抽取数据,为其后进行的编码转换、缓冲及解析提供字符序列。