当前位置:网站首页>C语言——文件操作函数 fseek、ftell、rewind详解
C语言——文件操作函数 fseek、ftell、rewind详解
2022-08-11 05:16:00 【云逸943】
前言
前面,我讲了讲文件操作的第二步:文件的读写操作,里面详细的介绍了各类读写函数的用法,有兴趣的小伙伴可以去看看:
接下来,我再来讲一讲关于标题中这三个函数的用法。
目录
A.方法1.采用SEEK_CUR 当前指针指向的位置为中心 。
一.fseek函数——
1. 功能:
根据文件指针的位置和偏移量来定位文件指针。(只用来:定位!!!)
2.参数解析:
fseek第一个参数为流,第二个参数为偏移量,第三个参数为文件指针定位的位置
/*SEEK_SET 以文件开头为中心
SEEK_CUR 文件指针的当前位置为中心
SEEK_END 文件结尾为中心*/
下图为不使用fseek的代码:
int main() {
FILE* pf = fopen("file.txt", "r");
if (pf == NULL) {
printf("%s\n", strerror(errno));
return 1;
}
char ch = 0;
ch=fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
fclose(pf);
pf = NULL;
return 0;
}
代码讲解:字符输出函数——fgetc(),一次读取一个字符。使用fgetc函数时,第一次指针只能指向开头位置,每使用一次fgetc才能读取一个字符,指针会逐步向后,这种方法很死板,不能随心所欲的想指向哪个文件内容就指向哪个。
上图为file.txt文件的内容
于是有了fseek函数,可以随心所欲的让文件指针指向想要的位置,以便获取想要的文件内容。
3.练习1.要求输出字符c
int main() {
FILE* pf = fopen("file.txt", "r");
if (pf == NULL) {
printf("%s\n", strerror(errno));
return 1;
}
char ch = 0;
// //文件内容:abcdef
fseek(pf, 2, SEEK_SET);
ch = fgetc(pf);//ch接收文件指针指向的内容,c字符
printf("%c\n", ch);
fclose(pf);
pf=NULL;
return 0;
}
代码讲解: fseek(pf, 2, SEEK_SET);
这句代码意为:将文件指针指向文件内容开头位置,偏移量为2,偏移量0代表a,2代表0+2,即文件指针指向a之后的第2个字符c。
练习2.要求输出字符f
int main() {
FILE* pf = fopen("file.txt", "r");
if (pf == NULL) {
printf("%s\n", strerror(errno));
return 1;
}
char ch = 0;
//方法1.
fseek(pf, 2, SEEK_CUR);
ch = fgetc(pf); //ch接收文件指针指向的内容,f字符
printf("方法1:%c\n", ch);
//方法2:
fseek(pf, 5, SEEK_SET);
ch = fgetc(pf); //ch接收文件指针指向的内容,f字符
printf("方法2:%c\n", ch);
//方法3:
fseek(pf, -1, SEEK_END);
ch = fgetc(pf); //ch接收文件指针指向的内容,f字符
printf("方法3:%c\n", ch);
fclose(pf);
pf = NULL;
return 0;
}
代码讲解:此代码打开文件的方式为:读文件
A.方法1.采用SEEK_CUR 当前指针指向的位置为中心 。
fseek(pf, 2, SEEK_CUR);//这句代码意为:将文件指针指向当前指针指向的字符位置,因为在练习1中,文件指针在被读取后,指针自动跳向下一个字符位置d,当前偏移量0代表d, 偏移量设为2,2代表字符f。
B.方法2:SEEK_CUR 文件指针的当前位置为中心。
fseek(pf, 5, SEEK_SET);//这句代码意为:将文件指针指向文件开头位置,当前偏移量0代表a, 偏移量设为5,5代表字符f。
C.方法3:SEEK_END 文件结尾为中心。
fseek(pf, -1, SEEK_END);//意为:将文件指针指向文件内容末尾位置,文件内容为abcdef,末尾位置为字符f之后的位置,偏移量-1,让指针向前移动一个位置,使得指针能够指向字符f。
二.ftell函数
long int ftell ( FILE * stream );
1.功能:
返回文件指针相对于起始位置的偏移量。
2.代码实践:
int main() {
FILE* pf = fopen("file2.txt", "r");
if (pf == NULL) {
printf("%s\n", strerror(errno));
return 1;
}
char ch = 0;
//文件内容:abcdef
fseek(pf, 2, SEEK_SET);
ch = fgetc(pf);//ch接收文件指针指向的内容,c字符
printf("%c\n", ch);
printf("%d\n",ftell(pf));//3
fseek(pf, -1, SEEK_END);
ch = fgetc(pf);//ch接收文件指针指向的内容,f字符
printf("%c\n", ch);
printf("%d\n", ftell(pf));//
fclose(pf);
pf = NULL;
return 0;
}
调试结果如下:
代码讲解:此文件打开方式为:读文件
结果为3的原因:因为ch接收了pf指向的位置的字符c,输出后,文件指针会自动跳到下一个字符d的位置,ftell函数就是计算指针当前位置相对于文件开头位置的偏移量距离。
结果为6的原因:ch接收了文件指针指向的字符f后,自动向后,指向了末尾位置,ftell函数计算了末尾位置相对于文件开头位置的偏移量距离为6,偏移量距离为0表示第一个文件内容a;偏移量距离为5,表示文件内容中第6个内容字符f。
三.rewind函数
1.功能:
让文件指针的位置回到文件的起始位置。
2.代码实践:
int main() {
FILE* pf = fopen("file2.txt", "r");
if (pf == NULL) {
printf("%s\n", strerror(errno));
return 1;
}
char ch = 0;
// //文件内容:abcdef
//练习1.要求输出字符c
fseek(pf, 2, SEEK_SET);
ch = fgetc(pf);//ch接收文件指针指向的内容,c字符
printf("%c\n", ch);
printf("%d\n", ftell(pf));//偏移量为3
rewind(pf);//让文件指针回到文件起始位置
printf("%d\n", ftell(pf));
printf("----------------\n");
fseek(pf, -1, SEEK_END);
ch = fgetc(pf);//ch接收文件指针指向的内容,f字符
printf("%c\n", ch);
printf("%d\n", ftell(pf));//6
rewind(pf);//让文件指针回到文件起始位置
printf("%d\n", ftell(pf));//0
fclose(pf);
pf = NULL;
return 0;
}
好了,这三个函数的功能与用法就讲到这里,大家觉得有用的话记得点个三连哟~,下期见!
边栏推荐
猜你喜欢
随机推荐
selenuim使用cookie登录京东
flaks framework learning: adding variables to the URL
Solidrun hummingboard制作SD卡
【翻译】博客游戏项目Q1K3 – 制作
QT Mat转HObject和HObject转Mat 图像视觉处理
做款好喝的茶饮~
task06 PyTorch生态
Visual Studio上一些Error的解决方案
Flask框架学习:模板渲染与Get,Post请求
第二篇 DS5 Armv8 样例工程报错之GCC编译
LeetCode1166.设计文件系统
吃瓜教程task04 第5章 神经网络
Summary: Cross Validation
全国青少年信息学奥林匹克联赛大纲
【背包】采药题解
(2) Construction of a real-time performance monitoring platform (Grafana+Prometheus+Jmeter)
c 指针学习(1)
CentOS卸载Oracle 11gR2(x64)_转载
【win10+cuda7.5+cudnn6.0安装caffe③】编译及测试caffe
第10章 对象和类 -1