四.二进制流
1.二进制流中的字节将完全根据程序编写它们的形式写入到文件或设备中,而且完全根据它们从文件或设备读取的形式读入到程序中。
2.这种类型的流适用于非文本数据,但是如果I/O函数修改文本文件的行末字符,也可以把它用于文本文件。
五文件
1.stdio.h所包含的声明之一就是FILE结构。FILE是一个数据结构,用于访问一个流。
2.如果同时激活了几个流,每个流都有一个相应的FILE与它关联。为了在流上执行一些操作,可以调用一些合适的函数,并向它们传递一个与这个流关联的FILE参数。
3.对于每个ANSI C程序,运行时系统必须提供至少三个流:
1>标准输入(standard input):标准输入是缺省情况下输入的来源。
2>标准输出(standard output) :标准输出是缺省的输出设置
3>标准错误(standard error):就是错误写入的地方。Perror函数把它的输出也写到这个地方。在许多系统中,标准输出和标准错误在缺省情况下相同的。但是,为错误信息准备一个不同的流以为着,即使标准输出重定向到其他地方,错误信息仍将出现在屏幕或其他缺省的输出设备上。
这些流的名字分别是stdin、stout和stderr。它们都是一个指向FILE结构的指针。
4.许多操作系统允许用户在程序执行时修改缺省的标准输入和输出设备.
例如:
MS-DOS和UNIX系统都支持用下面的方法进行输入/输出重定向:program < data > answer
当该程序执行时,它将从文件data 而不是键盘作为标准输入进行读取,它将把标准输出写入到文件answer而不是屏幕上。
5.程序为必须同时活动状态的每个文件声明一个指针变量,其类型为FILE *。这个指针指向这个FILE结构,当它处于活动状态时由流使用。
6.流通过调用fopen函数打开。为了打开一个流,你必须指定需要访问的文件或设备以及它们的访问方式(例如:读、写或者既读又写)。fopen()和操作系统验证文件或设备确实存在并初始化FILE结构。然后,根据需要对该文件进行读取或写入。最后,调用flose函数关闭流。关闭一个流可以防止与它相关联的文件被再次访问,保证任何存储于缓冲区的数据被正确地写到文件中,并且释放FILE结构使它可以用于另外的文件。
7.I/O函数以三种基本的形式处理数据:单个字符、文本行和二进制数据。对于每种形式,都有一组特定的函数对它们进行处理。
8.打开流
1>fopen()函数打开一个特定的文件,并把一个流和这个文件相关联。原型如下:
FILE *fopen(char const *name,char const *mode);
? 两个参数都是字符串。
? name是打开的文件或设备的名字。创建文件名的规则在不同系统中各不相同,所以fopen()把文件名作为一个字符串而不是路径名、驱动器字母、文件扩张名等各准备一个参数。这个参数指定要打开的文件—FILE *变量的名字是程序用来保存fopen的返回数值的,它并不影响哪个文件被打开。
? mode(模式)参数提示流是用于只读、只写还是既读有写,以及它是文本流还是二进制流。
? mode以r、w或a开头,分别表示打开的流用于读取、写入还是添加。如果一个文件打开是用于读取的,那么它必须是原先已经存在的。但是,如果一个文件打开是用于写入的,如果它原先已经存在,那么它原来的内容就会被删除。如果它原先不存在,那么就创建一个新文件。如果一个打开用于添加的文件并不存在,那么它将被删除。如果它原先已经存在,它原先的内容并不会被删除。无论在那一种情况下,数据只能从文件的尾部写入。
? 在mode中添加”a+”表示该文件打开用于更新,并且流既允许读也允许写。但是,如果已经从文件读入了一些数据,那么在开始向它写入数据之前,你必须调用其中一个文件定位函数(fseek、fsetpos、rewind)。
? 在向文件写入一些数据之后,如果想从该文件读取一些数据数据,必须首先调用fflush函数或者文件定位函数之一。
? 如果fopen()函数执行成功,它返回一个指向FILE结构的指针,该结构代表这个新创建的流。如果函数执行失败,它就返回一个NULL指针,errno会提示问题的性质。
说明:应该始终检查返回fopen函数的返回值。如果函数失败,它会返回一个NULL值。如果程序检查错误,这个NULL指针就会传给后续的I/O函数。
9.关闭流
1>流是用函数fclose关闭的,它的原型如下:
int fclose(FILE *f);
对于输出流,fclose函数在文件关闭之前刷新缓冲区。 如果它执行成功,fclose返回零,否则返回EOF。