首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C语言】fseek、ftell以及rewind函数(随机文件读写)

【C语言】fseek、ftell以及rewind函数(随机文件读写)

作者头像
埋头编程
发布2024-10-16 18:33:03
发布2024-10-16 18:33:03
6600
举报
文章被收录于专栏:C/C++C/C++

前言

在之前,我讲过文件的顺序读写。但是我们可不可以随机读写文件呢?答案是当然可以的,只要我们合理的控制文件指针的位置(光标),就能够读取到我们想要读取的数据。

C语言给我们提供了随机读写文件的函数,只要我们能够合理的运用它们,就能够实现我们要达到的效果。

那么,今天我们就来一起探讨一下随机文件读取函数!!!

1. fseek

fseek函数的作用:重新定位光标的位置。

一般来说,我们打开一个文本文件,文件的光标位置都会处在文件内容最开始的位置,也就是如下的样子:

光标
光标

那我们运用fseek函数,就能够按照我们的意愿随意改变光标出现的位置,然后在开始读取文件的内容。

1.1 fseek函数原型

fseek
fseek
fseek函数的形参
fseek函数的形参
fseek函数返回值
fseek函数返回值

如果fseek函数执行成功,则返回0 。否则返回一个非0值。

1.2 fseek函数的形式参数

这里我要重点讲解一下fseek函数的形式参数。

形参名

作用

steam

文件指针变量

offset

光标的偏移量

origin

设置光标的起始位置

看到offset这个变量名时,不知道大家有没有想起,我在结构体内存对齐的那边文章中用了一个offsetof函数检测了结构体成员相对于起始位置的偏移量。

而offset则是光标位置相对于设置光标起始位置之后的偏移量。

那对于origin变量,C编译器给我们提供了3个宏,它们分别是:

作用

SEEK_SET

将光标重置到文件开头的位置 (比较常用)

SEEK_CUR

将光标重置到当前文件内容的最末尾位置 (比较常用)

SEEK_END

将光标重置到文件结束标志的后面

1.3 fseek实例演示

代码语言:javascript
复制
//fseek函数的实例演示
//现在我有一个文件test4.txt,内容为26个英文字母。现在我只想读取从字母m之后的所有字母,并打印到屏幕上。
int main()
{
	char ch = 0;
	int count = 0;

	FILE* pf = fopen("test4.txt","r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	
	while (ch = fgetc(pf))
	{
		if (ch == 'm')
		{
			break;
		}
		count++;
	}

	fseek(pf,count,SEEK_SET);

	while ((ch = fgetc(pf)) != EOF)
	{
		fprintf(stdout,"%c",ch);
	}

	fclose(pf);
	pf = NULL;

	return 0;
}
文件内容
文件内容

2. ftell

ftell函数的作用:告诉我们目前光标的位置,从0开始。

2.1 ftell函数原型

ftell函数原型
ftell函数原型
ftell函数的返回值
ftell函数的返回值

ftell函数如果执行失败,则返回-1 。

2.2 ftell函数的实例演示

代码语言:javascript
复制
int main()
{
	char ch = 0;

	FILE* fp = fopen("test4.txt","r");

	if (fp== NULL)
	{
		perror("fopen");
		return 1;
	}

	ch = fgetc(fp);
	printf("%d\n", ftell(fp));

	ch = fgetc(fp);
	printf("%d\n", ftell(fp));
	
	fclose(fp);
	fp = NULL;

	return 0;
	
}

3. rewind

rewind函数的作用:将光标中重置到文件最开头的位置,也就是ftell读取值为0的地方。

3.1 rewind函数原型

rewind函数原型
rewind函数原型

3.2 rewind函数实例演示

代码语言:javascript
复制
//rewind函数
int main()
{
	char ch = 0;

	FILE* fp = fopen("test4.txt","r");

	if (fp== NULL)
	{
		perror("fopen");
		return 1;
	}

	ch = fgetc(fp);
	printf("%c\n",ch);
	
	printf("%d\n", ftell(fp));

	rewind(fp);
	ch = fgetc(fp);
	printf("%c\n", ch);

	printf("%d\n", ftell(fp));

	fclose(fp);
	fp = NULL;

	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1. fseek
    • 1.1 fseek函数原型
    • 1.2 fseek函数的形式参数
    • 1.3 fseek实例演示
  • 2. ftell
    • 2.1 ftell函数原型
    • 2.2 ftell函数的实例演示
  • 3. rewind
    • 3.1 rewind函数原型
    • 3.2 rewind函数实例演示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档