当前位置:嗨网首页>书籍在线阅读

09-fopen()函数

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

13.2.2  fopen() 函数

继续分析程序清单13.1,该程序使用 fopen() 函数打开文件。该函数声明在 stdio.h 中。它的第1个参数是待打开文件的名称,更确切地说是一个包含该文件名的字符串地址。第2个参数是一个字符串,指定待打开文件的模式。表13.1列出了C库提供的一些模式。

表13.1  `fopen()` 的模式字符串

| 模式字符串 | 含义 | | :----- | :----- | :----- | :----- | | "r" | 以读模式打开文件 | | "w" | 以写模式打开文件,把现有文件的长度截为0,如果文件不存在,则创建一个新文件 | | "a" | 以写模式打开文件,在现有文件末尾添加内容,如果文件不存在,则创建一个新文件 | | "r+" | 以更新模式打开文件(即可以读写文件) | | "w+" | 以更新模式打开文件(即,读和写),如果文件存在,则将其长度截为0;如果文件不存在,则创建一个新文件 | | "a+" | 以更新模式打开文件(即,读和写),在现有文件的末尾添加内容,如果文件不存在则创建一个新文件;可以读整个文件,但是只能从末尾添加内容 | | "rb""wb""ab""rb+" 、 | "r+b""wb+""w+b" 、 | "ab+""a+b" | 与上一个模式类似,但是以二进制模式而不是文本模式打开文件 | | "wx""wbx" 、 | "w+x""wb+x""w+bx" | (C11)类似非x模式,但是如果文件已存在或以独占模式打开文件,则打开文件失败 |

像UNIX和Linux这样只有一种文件类型的系统,带 b 字母的模式和不带 b 字母的模式相同。

新的C11新增了带 x 字母的写模式,与以前的写模式相比具有更多特性。第一,如果以传统的一种写模式打开一个现有文件, fopen() 会把该文件的长度截为 0 ,这样就丢失了该文件的内容。但是使用带 x 字母的写模式,即使 fopen() 操作失败,原文件的内容也不会被删除。第二,如果环境允许, x 模式的独占特性使得其他程序或线程无法访问正在被打开的文件。

警告 如果使用任何一种"w"模式(不带x字母)打开一个现有文件,该文件的内容会被删除,以便程序在一个空白文件中开始操作。然而,如果使用带x字母的任何一种模式,将无法打开一个现有文件。

程序成功打开文件后, fopen() 将返回文件指针(file pointer),其他I/O函数可以使用这个指针指定该文件。文件指针(该例中是 fp )的类型是指向 FILE 的指针, FILE 是一个定义在 stdio.h 中的派生类型。文件指针 fp 并不指向实际的文件,它指向一个包含文件信息的数据对象,其中包含操作文件的I/O函数所用的缓冲区信息。因为标准库中的I/O函数使用缓冲区,所以它们不仅要知道缓冲区的位置,还要知道缓冲区被填充的程度以及操作哪一个文件。标准I/O函数根据这些信息在必要时决定再次填充或清空缓冲区。 fp 指向的数据对象包含了这些信息(该数据对象是一个C结构,将在第14章中介绍)。