C语言文件操作(三) —— 文件的随机读写(fseek / lseek)

        目录

1、什么是文件的随机读写

2、认识文件随机读写函数

(1) fseek 函数 —— 移动文件指针的位置

(2) ftell 函数 —— 告知当前文件指针相对于起始位置的偏移量

(3) rewind —— 让文件指针重新回到起始位置


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;

  • 11
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值