动与静——流与文件
"流"的概念
- 大家听到“流”这个字是否很自然的就想到了什么水流、电流什么的,当我们应用在计算机上面的时候,计算机处理的一切数据都是以“数据流”这种很形象的方式来被处理的。在C语言中所有的I/O操作只是简单地从程序中移进或移出字节(单位),这种字节流便称为流
- 流的分类有两种类型:即**文本流和二进制流** 。这是在C语言里面的说法,如果学过java的话,java里面称之为 **字符流和字节流(形象称谓)** 。但是表达的意思是一样的。
- 文本流是指在流中流动的数据是是字符形式的。文本流的某些特性在不同系统中可能不同。
- 二进制流是指在在流中流动的是二进制数字序列
- 但是这里要注意:当计算机处理数据的时候都是以二进制形式来处理的,即所有的数据都会转换成由‘0’和‘1’组成的一连串的序列。在c程序中,当流中有字符的时候。写入到文件或者设备的是一个字节的二进制ASCII码。当流中有数字写入到文件或者设备的则是一个(对应数据类型)字节的二进制数字。
文件
相信文件对大家来说并不会陌生,我们在使用电脑的时候都会操作文件。电脑中的文件有很多种类型:例如视频、音频、程序等。而且操作系统就是以文件为基本的数据管理单位。
- C语言是由一个个字符的数据顺序组成的。根据数据的组织形式,可将文件分成两种类型:ASCII码文件和二进制文件。其中ASCII码文件也就是前面所说的文本文件,它的没一个字节存放的都是一个ASCII码,来代表一个字符。二进制文件是把内存中的数据按其在内存中的存储形式原样输出放到磁盘上存放。
文件类型指针
既然提到了C语言和文件,那么C语言是怎么来操纵来进行文件的读写呢?在C语言中,对文件的读写一般使用C语言的库函数来完成。ANSI规定了标准的输入输出函数,用它们来对文件进行读写可以提高编程的效率。每个被使用的文件在内存中都会开辟一个区,用来存放文件的有关信息。这些信息都会保存在一个结构体FILE中。
- 其申明如下:
typedef struct
{
short level; //缓冲区“满”或“空”的程度
unsigned flags; //文件状态标志
char fd; //文件描述符
unsigned char hole;//如无缓冲区不读取字符
short basize; //缓冲区的大小
unsigned char *buffer;//数据缓冲区的位置
unsigned char *curp; //指针当前指向
unsigned istemp; //临时文件,指示器
short token; //用于有效性检查
}FILE;
- **FILE可用于访问一个流。假若同时激活了几个流,那么每一个流都有一个相应FILE与其关联。
为了在流上执行一些操作,需要调用一些合适的库函数,并传递一个与流相关联的FILE参数。**
- C语言定义了3个特别**的文件指针常数**: 标准输入(Standard Input)、标准输出(Standard Output)和标准错误(Standart Error)。这三个流的名字分别是stdin、stdout、stderr,它们都是一个指向FILE结构的指针。
- 标准输入通常是键盘;标准输出通常为终端或屏幕;标准错误就是错误写入的地方,在许多系统中,标准输出和标准错误在默认情况下是相同的。
我们如何来使用这个FILE结构体呢
- 其实这个与我们平常使用普通结构体是一样的。
- 我们可以定义一个普通的变量,如:FILE fp;
- 或者我们也可以定义一个指向文件的指针,如:FILE *fp;
总结
- 1.流分为文本流和二进制流两种
- 2.根据数据的组织形式,C语言把文件分为文本文件和二进制文件。
- 3.每个被使用的文件信息都保存到一个结构体(FILE)中