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;
}

运行结果

相关推荐
----云烟----1 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024061 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic2 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it2 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康2 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神2 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
搬砖的小码农_Sky2 小时前
C语言:数组
c语言·数据结构
宅小海3 小时前
scala String
大数据·开发语言·scala
qq_327342733 小时前
Java实现离线身份证号码OCR识别
java·开发语言
锅包肉的九珍3 小时前
Scala的Array数组
开发语言·后端·scala