88.【C语言】文件操作(5)

目录

文件的随机读写

1.fseek函数

代码示例

运行结果

2.ftell函数

代码示例

运行结果

3.rewind函数

代码示例

运行结果


承接79.【C语言】文件操作(4)文章

文件的随机读写

1.fseek函数

声明:int fseek ( FILE * stream, long int offset, int origin );

格式:fseek(文件指针,偏移量,起始位置);

作用:根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)

类比Intel 8086汇编语言的 int10h中断便可理解fseek函数为什么要这样做

1.先设置光标位置

cpp 复制代码
mov ah,2  ;int 10h的2号子功能:置光标
mov bh,0  ;第0页
mov dh,5  ;dh中放行号
mov dl,12 ;dl中放列号
int 10h

2.在光标位置显示字符

cpp 复制代码
mov ah,9  ;int 10h的第9号子功能:在光标位置显示字符
mov al,'a';字符
mov bl,7  ;颜色属性
mov bh,0  ;第0页
mov cx,3  ;字符重复的个数
int 10h

起始位置的表格

|----------|-------------|
| 常量 | 位置 |
| SEEK_SET | 文件开始的位置 |
| SEEK_CUR | 文件指针当前指向的位置 |
| SEEK_END | 文件的末尾 |

提前建好data.txt,输入1234567,保存

代码示例

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
	FILE* p = fopen("data.txt", "r");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}

	int ch = fgetc(p);
	printf("%c", ch);

	fseek(p, 2, SEEK_CUR);

	ch = fgetc(p);
	printf("%c", ch);

	fclose(p);
	p = NULL;

    return 0;
}
cpp 复制代码
	fseek(p, 2, SEEK_CUR);

含义是:从当前指针的位置开始算,偏移量为2

改成下方的代码,运行结果是一样的

cpp 复制代码
	fseek(p, 3, SEEK_SET);

含义是:从文件起始的位置开始算,偏移量为3

改成下方的代码,运行结果还是一样的

cpp 复制代码
	fseek(p, -3, SEEK_END);

含义是:从文件末尾的位置开始算,偏移量为-3

如果用图来说明的话:

将data.txt用HxD.exe(点我跳转至官网下载)打开

图里的Offset(h)是以十六进制显示的偏移量

如果将SEE_SET,SEEK_END标在上面的话

cpp 复制代码
	int ch = fgetc(p);
	printf("%c\n", ch);
	fseek(p, 0, SEEK_SET);
	ch = fgetc(p);
	printf("%c\n", ch);

两次打印的结果是一样的

运行结果

2.ftell函数

声明:long int ftell ( FILE * stream );

格式:ftell(文件指针);

作用:返回文件指针相对于起始位置的偏移量

代码示例

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
	FILE* p = fopen("data.txt", "r");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}
	long int ret = ftell(p);
	printf("%ld\n", ret);
	int ch = fgetc(p);
    ret = ftell(p);
	printf("%ld\n", ret);

	fclose(p);
	p = NULL;

	return 0;
}

运行结果

3.rewind函数

声明:void rewind ( FILE * stream );

格式:rewind(文件指针);

作用:将文件指针恢复至初始位置

代码示例

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
	FILE* p = fopen("data.txt", "r");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}

	int ch = fgetc(p);
	printf("%c\n", ch);
	ch = fgetc(p);
	printf("%c\n", ch);
	ch = fgetc(p);
	printf("%c\n", ch);
	rewind(p);
	ch = fgetc(p);
	printf("%c\n", ch);
	fclose(p);
	p = NULL;

	return 0;
}

运行结果

相关推荐
mark-puls2 分钟前
Qt标签页控件QTabWidget全面指南:创建现代化多页界面
开发语言·qt·设计模式
Brookty29 分钟前
深入解析Java类加载与实例化流程
java·开发语言·学习
终焉代码1 小时前
【C++】map与set底层结构——红黑树
开发语言·数据结构·c++
Lonble1 小时前
C语言篇:预处理
c语言·c
数字化顾问1 小时前
“AMQP协议深度解析:消息队列背后的通信魔法”之核心概念与SpringBoot落地实战
开发语言·后端·ruby
haing20192 小时前
使用matlab进行牛顿迭代求函数极值的方法
开发语言·matlab·牛顿迭代
kernelknight12 小时前
MATLAB For循环详解:从入门到精通的完整指南
开发语言·其他·matlab
Cx330❀2 小时前
《C++ STL:vector类(下)》:攻克 C++ Vector 的迭代器失效陷阱:从源码层面详解原理与解决方案
开发语言·数据结构·c++·经验分享·算法
user_huenquan2 小时前
胡恩全10.3作业
开发语言·c++
少陵野小Tommy3 小时前
C语言计算行列式的值
c语言·开发语言·学习·学习方法