目录
(2) ftell 函数 —— 告知当前文件指针相对于起始位置的偏移量
1、什么是文件的随机读写
我们使用fopen打开一个文件可以得到一个文件指针,这个文件指针也会被用于读写文件的时候。我们在读取一个文件的时候,文件指针指向下一个我们要读取的字符(一开始指向第一个字符),每当我们调用一次读取函数时,如 fgetc/fgets,这个文件指针就会向后移动一个或者多个单位。
文件的随机读写,其实就是我们可以
指定这个文件指针指向的位置
,即指向第几个字符,然后从这个字符开始读写。
2、认识文件随机读写函数
(1) fseek 函数 —— 移动文件指针的位置
fseek 函数的作用是,给定起始位置和偏移量,移动文件指针到指定位置。函数声明如下:
第一个参数:文件指针
第二个参数:相对于起始位置的偏移量。
-
offset < 0
,从起始位置起,
向左
移动 | offset | 个单位
-
offset > 0
,从起始位置起,
向右
移动 | offset | 个单位
第三个参数:起始位置。可选值有三个
可选值 |
解析 |
SEEK_CUR |
当前文件指针指向的位置 |
SEEK_END |
文件末尾 |
SEEK_SET |
文件起始位置 |
返回值:成功返回0,失败返回一个非零值。
FILE* pf = fopen("D:\\data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return -1;
}
int ch1 = fgetc(pf);
printf("%c\n", ch1); // a
fseek(pf, -1, SEEK_CUR); // 将文件指针相对于当前位置向左移动一个单位
int ch2 = fgetc(pf);
printf("%c\n", ch2); // a
fclose(pf);
pf = NULL;
一开始文件指针指向起始位置
第一次调用 fgetc ,文件指针向后移动一个单位,指向了字符 ‘b’
调用 fseek,将文件指针相对于当前位置向左移动一个单位,此时文件指针又重新指向字符 ‘a’
此时再次调用 fgetc 获取到的字符就是 ‘a’,所以打印结果为
(2) ftell 函数 —— 告知当前文件指针相对于起始位置的偏移量
ftell 函数可以返回当前文件指针相对于起始位置的偏移量,这里说的起始位置,默认指的是文件开始的位置。函数声明如下:
第一个参数:文件指针
返回值:成功返回一个偏移量;失败返回-1L,同时errno会被设置
FILE* pf = fopen("D:\\data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return -1;
}
fgetc(pf);
fgetc(pf);
long pos = ftell(pf);
printf("%d\n", pos);
fclose(pf);
pf = NULL;
(3) rewind —— 让文件指针重新回到起始位置
rewind 函数可以让文件指针回到 文件开始的位置。函数声明如下:
第一个参数:文件指针
FILE* pf = fopen("D:\\data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return -1;
}
fgetc(pf);
fgetc(pf);
long pos = ftell(pf);
printf("重置之前文件指针的位置: %d\n", pos);
rewind(pf);
pos = ftell(pf);
printf("重置之后文件指针的位置: %d\n", pos);
fclose(pf);
pf = NULL;