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

  • Post author:
  • Post category:其他



目录


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;



版权声明:本文为challenglistic原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。