文章目录
- 0 前言
- 1 文件位置指示符
- 2 rewind()
- 2.1 函数原型
- 2.2 参数
- 2.3 返回值
- 2.4 使用说明
- 3 ftell()函数
- 3.1 函数原型
- 3.2 参数
- 3.3 返回值
- 4 fseek()
- 4.1 函数原型
- 4.2 参数
- 4.3 返回值
- 5 示例
- 5.1 示例1
- 5.2 示例2
0 前言
C语言文件访问分为顺序文件访问和随机文件访问。
1 文件位置指示符
关于文件位置指示符:
- 每个打开的文件都有一个相关联的文件位置指示符;
- 文件位置指示符指明在文件中进行读写操作的位置;
- 位置以偏离文件开头(第一个字节)的字节数表示,文件开头的位置为0;
- 以a、ab、a+、ab+模式打开现有文件时,文件位置指示符位于文件末尾;
- 以r、rb、w、wb、r+、rb+、w+、wb+模式打开现有文件时,文件位置指示符位于文件开头;
- 文件读写操作发生在位置指示符所标注的位置,并更新位置指示符。
2 rewind()
2.1 函数原型
rewind():把文件位置指示符设置至文件开头,函数原型如下:
void rewind(FILE *stream);
2.2 参数
rewind()函数只有一个参数stream:
- 参数stream是一个指向FILE类型结构的指针(fopen()函数的返回值)。
2.3 返回值
rewind()函数的返回值为空void。
2.4 使用说明
在不关闭文件的情况下,调用rewind()函数后,文件的位置指示符被设置到文件的开头0字节处;此时,可以从文件开头处开始,重新读取文件数据。
3 ftell()函数
3.1 函数原型
ftell():获取文件位置指示符的当前位置,函数原型如下:
long int ftell(FILE *stream);
3.2 参数
ftell()函数只有一个参数stream:
- 参数stream是一个指向FILE类型结构的指针(fopen()函数的返回值)。
3.3 返回值
ftell()函数返回值类型为long型:
- 获取成功,返回文件位置指示符的当前位置,指出当前读写位置偏离文件开头多少字节;
- 获取失败,返回-1L。
4 fseek()
4.1 函数原型
fseek():设置文件位置指示符的位置,函数原型如下:
int fseek(FILE *stream, long offset, int origin);
4.2 参数
fseek()函数有三个参数:
- 参数stream:指向FILE类型结构的指针(fopen()函数的返回值);
- 参数offset:文件位置指示符相对起始位置origin的偏移量,以字节为单位,类型为long型;offset为正时,向后移动;offset为负时,向前移动;
- 参数origin:文件位置指示符偏移量offset的起始位置,类型为int型。
origin有三种取值,如下图所示:
4.3 返回值
fseek()函数的返回值为int型:
- 设置成功,返回0;
- 设置失败,返回非0值。
C语言标准描述如下:
1. If successful, fseek returns 0.
2. Otherwise, it returns a nonzero value.
5 示例
5.1 示例1
验证rewind函数是否将文件位置指示符设置至文件开头,示例代码如下所示:
#define BUFLEN 6
int main()
{//char msg[] = "abcdefghijklmnopqrstuvwxyz";FILE* fp;char buf[BUFLEN] = { 0 };//if ((fp = fopen("1.txt", "w")) == NULL){printf("Failed to open file.\n");exit(1);}//if ((fputs(msg, fp)) == EOF){printf("Failed to write file.\n");exit(1);}//fclose(fp);//if ((fp = fopen("1.txt", "r")) == NULL){printf("Failed to open file.\n");exit(1);}printf("After open file, position = %ld\n", ftell(fp));//fgets(buf, BUFLEN, fp);printf("After read sting %s, position = %ld\n", buf, ftell(fp));//fgets(buf, BUFLEN, fp);printf("After read sting %s, position = %ld\n", buf, ftell(fp));//rewind(fp);printf("After rewind, position = %ld\n", ftell(fp));//fgets(buf, BUFLEN, fp);printf("After read sting %s, position = %ld\n", buf, ftell(fp));//fclose(fp);return 0;
}
代码运行结果如下图所示:
5.2 示例2
使用fseek()函数设置文件位置指示符,示例代码如下所示:
#define MAX 50int main()
{//变量定义FILE* fp;int data = 0;int count = 0;int arr[MAX] = { 0 };long offset;//初始化数组for (count = 0; count < MAX; count++){arr[count] = count * 10;}//打开文件if ((fp = fopen("1.dat", "wb")) == NULL){printf("Failed to open file.\n");exit(1);}//写文件if ((fwrite(arr, sizeof(int), MAX, fp)) != MAX){printf("Failed to write file.\n");exit(1);}//关闭文件fclose(fp);//打开文件if ((fp = fopen("1.dat", "rb")) == NULL){printf("Failed to open file.\n");exit(1);}//读文件while (1){//printf("请输入数组元素的下标:>\n");scanf("%ld", &offset);//if (offset < 0){break;}else if(offset > MAX - 1){continue;}//if ((fseek(fp,(offset*sizeof(int)),SEEK_SET)) != 0){printf("Failed to use fseek().\n");exit(1);}//fread(&data, sizeof(int), 1, fp);//printf("arr[%ld] = %d\n", offset, data);}//关闭文件fclose(fp);return 0;
}
代码运行结果如下图所示: