it编程 > 编程语言 > C/C++

C语言文件随机读写的完全指南

19人参与 2025-10-18 C/C++

导读

无论是字符级的 fgetc/fputc,字符串操作的 fgets/fputs,还是格式化的 fscanf/fprintf,以及二进制的 fread/fwrite,这些函数都遵循着"从头到尾、依次处理"的顺序读写模式。

然而,在实际编程中,我们常常需要更灵活的文件操作方式。今天,我们将进入文件操作的另一个重要领域——随机读写,学习如何精准控制文件中的读写位置。让我们开始探索以下五个核心函数:

一、fseek

fseek

上图给出了函数用法的介绍,我们可以看到该函数不仅能够对文本文件使用,还可以对二进制文件使用;

fseek2

上图给我们介绍了函数的三个参数与返回值,从这两张图片介绍中,我们可以了解该函数的使用方法:

从用法中我们可以看到,该函数的使用与 ftell 函数是分不开的,因此我们下面直接来看一下 ftell 函数应该如何使用;

二、ftell

2.1 函数介绍

ftell

该函数的使用方法为:

2.2 函数使用

该函数的使用我们可以简单的理解为,函数会获取文件中的光标位置:

现在对于 fseek 和 ftell 这两个函数我们就能够理解为:

接下来我们就可以尝试着使用这两个函数了:

void test1() {
	file* pf = fopen("c:\\users\\liqian\\desktop\\data.txt", "r+");
	if (pf == null) {
		perror("fopen");
		return;
	}

	// 通过 ftell 获取文件中的光标当前位置
	long int index = ftell(pf);
	// 检查返回值
	if (index == -1l) {
		perror("ftell");
		fclose(pf);
		pf = null;
		return;
	}

	// 通过 fgetc 读取当前位置的文本信息
	int ch = fgetc(pf);
	while (ch != eof) {
		printf("ch = %c\n", ch);
		ch = fgetc(pf);
	}

	// 通过 fseek 设置文件中的光标位置
	int set = fseek(pf, index, seek_set);
	// 由于我们打开的为文本文件,因此 origin 的值必须为文件开头(seek_set)

	if (set != 0) {
		perror("fseek");
		fclose(pf);
		pf = null;
		return;
	}

	// 再一次读取当前位置的元素
	ch = fgetc(pf);
	printf("ch = %c\n", ch);

	fclose(pf);
	pf = null;
}

这里的测试代码逻辑比较简单:

下面我们就来运行以下该测试代码:

函数使用

从测试结果中可以看到,文件刚打开时,光标的位置为文件开头,当我们通过 ftell 记录了此时的位置后,我们通过 fgetc 移动了光标,不管光标最后在哪里,我们都可以通过 fseek 函数将光标设置到最初我们记录的位置;

那可能有朋友会问,如果我们在记录光标的起始位置时,光标并不在文件开头,这时我们需要将光标重置到文件开头,应该怎么办呢?

此时有两种办法:

接下来,我们就来看看 rwind 函数的具体用法;

三、rewind

3.1 函数介绍

函数介绍

该函数的用法如下:

3.2 函数使用

该函数简单的理解就是用于重置文件内部的光标位置。接下来我们就来对其进行测试:

void test2() {
	file* pf = fopen("c:\\users\\liqian\\desktop\\data.txt", "r+");
	if (pf == null) {
		perror("fopen");
		return;
	}

	// 通过 fgetc 先读取一定的文本信息
	for (int i = 0; i < 3; i++) {
		int ch = fgetc(pf);
		printf("ch = %c ", ch);
	}
	printf("\n");

	// 通过 ftell 获取文件中的光标当前位置
	long int index = ftell(pf);
	// 检查返回值
	if (index == -1l) {
		perror("ftell");
		fclose(pf);
		pf = null;
		return;
	}

	// 通过 fgetc 读取当前位置的文本信息
	int ch = fgetc(pf);
	while (ch != eof) {
		printf("ch = %c ", ch);
		ch = fgetc(pf);
	}
	printf("\n");

	// 通过 fseek 设置文件中的光标位置
	int set = fseek(pf, index, seek_set);
	// 由于我们打开的为文本文件,因此 origin 的值必须为文件开头(seek_set)

	if (set != 0) {
		perror("fseek");
		fclose(pf);
		pf = null;
		return;
	}

	// 再一次读取当前位置的元素
	ch = fgetc(pf);
	printf("ch = %c\n", ch);

	// 通过 rewind 重置光标位置
	rewind(pf);

	// 再一次读取当前位置的元素
	ch = fgetc(pf);
	printf("ch = %c\n", ch);

	fclose(pf);
	pf = null;
}

我们此时的测试逻辑很简单:

下面我们就来对其测试一下:

函数使用

可以看到,当我们使用 rewind 后,光标的位置就从我们最开始记录的 l 处重置为了文件开头 h 处。

因此当我们在对文件进行操作时,如果我们需要重置光标的位置,我们就可以通过 rewind 实现。

四、fgetpos

4.1 函数介绍

fgetpos

该函数的用法如下所示:

4.2 fpos_t

在函数的用法介绍中,我们看到了一个新的类型:fpos_t 。那么在使用该函数前,我们先来认识一下这个新的类型:

fpos_t

该类型就是专门用于记录文件中的光标位置的类型,该类型的变量中存储的信息,通常是通过 fgetpos 函数进行填充,并且其变量中的信息不能直接读取,只能够在调用 fsetpos 时,作为参数使用。

那也就是说,fgetposfsetpos 这两个函数应该搭配起来使用,那么接下来我们就一起来看看如何 fsetpos 的具体用法;

五、fsetpos

5.1 函数介绍

fsetpos

该函数的用法如下所示:

5.2 函数使用

该函数的用法我们可以简单的理解为,将文件中的光标位置恢复到 pos 中存储的位置。

这里需要注意的是,pos_t 的对象中存储的信息只能通过 fgetpos 获取,我们无法直接对其进行赋值操作!!!

接下来我们就来尝试着使用一下这两个函数:

void test3() {
	file* pf = fopen("c:\\users\\liqian\\desktop\\data.txt", "r");
	if (pf == null) {
		perror("fopen");
		return;
	}

	// 通过 fgetc 读取数据来移动光标
	for (int i = 0; i < 3; i++) {
		int ch = fgetc(pf);
		printf("ch = %c\n", ch);
	}
	printf("\n");
	// 记录光标位置变量
	fpos_t pos;

	// 通过 fgetpos 获取当前光标位置
	int get = fgetpos(pf, &pos);

	// 通过 fgetc 移动光标
	int ch = fgetc(pf);
	while (ch != '!') {
		printf("ch = %c\n", ch);
		ch = fgetc(pf);
	}

	printf("\nch = %c\n", ch);

	// 通过 fsetpos 来恢复光标位置
	int set = fsetpos(pf, &pos);
	
	ch = fgetc(pf);
	printf("\nch = %c\n", ch);

	fclose(pf);
	pf = null;
}

这一次我们测试的逻辑与前面的逻辑一致:

下面我们就来测试一下:

函数使用

可以看到,函数 fgetposfsetpos 二者配合起来使用,同样能够达到光标定位与设置的效果。

现在问题来了,这两个函数与前面我们介绍的 ftellfseek 之间有什么不同呢?

5.3 函数比较

5.3.1 相同点

不管是 ftell 与 fseek 的搭配使用,还是 fgetpos 与 fsetpos 的搭配使用,他们都是用来完成两件事:

5.3.2 不同点

这二者之间不同的地方在于—— 记录光标位置的方式不同

因此,这就导致了二者能够处理的文件大小有所区别:

也就是说,当我们处理大文件时,我们选择使用 fgetposfsetpos 会更加保险一点。

结语

通过今天的学习,我们深入掌握了c语言中实现文件随机读写的五个核心函数。让我们简单回顾一下本篇的重要内容:

函数功能总结

关键区别:

实践价值

掌握了这些函数,我们就能在文件中自由"穿梭",实现高效的随机访问,为复杂文件操作打下坚实基础。

以上就是c语言文件随机读写的完全指南的详细内容,更多关于c语言文件随机读写的资料请关注代码网其它相关文章!

(0)

您想发表意见!!点此发布评论

推荐阅读

深入解析C++中的智能指针

10-19

C++构建缓存加速的实现示例

10-19

详解C++中代理模式高级应用

10-19

C++获取对象真实地址的方法

10-15

C++友元函数和友元类的使用详解

10-14

c++中的继承与派生使用详解

10-14

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论