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

运行结果

相关推荐
2601_949146533 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
曹牧3 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX3 小时前
服务异步通信
开发语言·后端·微服务·ruby
zmzb01033 小时前
C++课后习题训练记录Day98
开发语言·c++
猫头虎4 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
YUJIANYUE4 小时前
PHP纹路验证码
开发语言·php
仟濹5 小时前
【Java基础】多态 | 打卡day2
java·开发语言
孞㐑¥5 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
Re.不晚5 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言
八零后琐话5 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python