12 文件管理
offset可以是正数(表示向前移动),或负数(表示向后移动)。
12.1 概述
在C语言中,有两种不同的方法来执行文件操作。第一种称为低级I/O,使用UNIX系统调用。第二种指的是高级I/O,使用C语言的标准I/O库函数。
表 12.1
函数名 | 操作 |
fopen | 创建一个文件,打开一个已有的文件 |
fclose | 关闭一个已打开的文件 |
getc | 从文件中读取一个字符 |
putc | 往文件中写入一个字符 |
getw | 从文件中读取一个整数 |
putw | 往文件中写入一个整数 |
fscanf | 从文件中读取一个数据集 |
fprintf | 往文件中写入一个数据集 |
fseek | 把位置设置在文件中的期望点 |
ftell | 给出处在文件中的当前位置(从文件头算起的字节数) |
rewind | 把位置设置在文件开头 |
12.2 定义并打开文件
要把数据存储在辅存的文件中,必须向操作系统指定文件的某些信息:
- 文件名:是一个字符串,包括基本名称和可选扩展名。如:store,student.c;
- 数据结构:文件的数据结构定义为FILE(在标准I/O函数定义库中)。
- 打开方式:当打开一个文件时,必须指定要对该文件进行何种操作。
表 12.2
12.3 随机访问文件
- ftell函数以一个文件指针为参数,返回一个long类型的数字,它对应于当前的位置。在保存文件的当前位置(这样在程序的后面就可以使用)时,该函数很有用。形式如下:n = ftell(fp);其中n给出了当前位置的相对偏移量(以字节为单位)
- rewind函数以一个文件指针为参数,把指针位置重置到文件的开头。形式如:rewind(fp);此时n = ftell(fp);语句的值为0,因为rewind把文件指针设置在了文件的开头。该函数不用反复关闭和打开文件,就可多次读取一个文件。只要是打开一个文件用于读或写入数据,就会隐式的运行rewind函数。
- fseek函数用于把文件指针移到指定的文件位置,其形式:fseek(ptr, offset, position);其中,ptr为文件指针,offset为long型整数或变量,position为一整数。offset指定从position开始计算的要移动的位置(以字节为单位)。position可以是以下三个值:
值 | 含义 |
0 | 文件的开头 |
1 | 当前位置 |
2 | 文件的末尾 |
表12.3 fseek函数
语句 | 含义 |
fseek(fp, 0L, 0); | 跳到文件开头(类似于rewind函数) |
fseek(fp, 0L, 1); | 停留在当前位置(很少使用) |
fseek(fp, 0L, 2); | 跳过文件剩余的字符,跳到文件末尾 |
fseek(fp, m, 0); | 在文件中前进(m+1)个字节 |
fseek(fp, m, 1); | 从当前位置前进m个字节 |
fseek(fp, -m, 1); | 从当前位置后退m个字节 |
fseek(fp, -m, 2); | 从文件末尾后退m个字节 |
当操作成功时,fseek返回0。如果试图将文件指针移出文件的边界,将产生一个错误,返回-1。