• C语言——文件操作函数 fseek、ftell、rewind详解


    前言

            前面,我讲了讲文件操作的第二步:文件的读写操作,里面详细的介绍了各类读写函数的用法,有兴趣的小伙伴可以去看看:

    C语言——文件操作(2)文件的读写操作_

            接下来,我再来讲一讲关于标题中这三个函数的用法。

    目录

    前言

    一.fseek函数——

         1. 功能:

    2.参数解析:

     3.练习1.要求输出字符c

        练习2.要求输出字符f

            A.方法1.采用SEEK_CUR 当前指针指向的位置为中心 。

            B.方法2:SEEK_CUR    文件指针的当前位置为中心。

            C.方法3:SEEK_END    文件结尾为中心。

    二.ftell函数

    1.功能:

    三.rewind函数

    1.功能:

    2.代码实践:


    一.fseek函数——

         1. 功能:

    根据文件指针的位置和偏移量来定位文件指针。(只用来:定位!!!)

    2.参数解析:

    fseek第一个参数为流,第二个参数为偏移量,第三个参数为文件指针定位的位置
                            /*SEEK_SET    以文件开头为中心
                            SEEK_CUR    文件指针的当前位置为中心
                            SEEK_END    文件结尾为中心*/

    下图为不使用fseek的代码:

    1. int main() {
    2. FILE* pf = fopen("file.txt", "r");
    3. if (pf == NULL) {
    4. printf("%s\n", strerror(errno));
    5. return 1;
    6. }
    7. char ch = 0;
    8. ch=fgetc(pf);
    9. printf("%c\n", ch);
    10. ch = fgetc(pf);
    11. printf("%c\n", ch);
    12. ch = fgetc(pf);
    13. printf("%c\n", ch);
    14. fclose(pf);
    15. pf = NULL;
    16. return 0;
    17. }

            代码讲解:字符输出函数——fgetc(),一次读取一个字符。使用fgetc函数时,第一次指针只能指向开头位置,每使用一次fgetc才能读取一个字符,指针会逐步向后,这种方法很死板,不能随心所欲的想指向哪个文件内容就指向哪个。

     

            上图为file.txt文件的内容 

     

            于是有了fseek函数,可以随心所欲的让文件指针指向想要的位置,以便获取想要的文件内容。

     3.练习1.要求输出字符c

    1. int main() {
    2. FILE* pf = fopen("file.txt", "r");
    3. if (pf == NULL) {
    4. printf("%s\n", strerror(errno));
    5. return 1;
    6. }
    7. char ch = 0;
    8. // //文件内容:abcdef
    9. fseek(pf, 2, SEEK_SET);
    10. ch = fgetc(pf);//ch接收文件指针指向的内容,c字符
    11. printf("%c\n", ch);
    12. fclose(pf);
    13. pf=NULL;
    14. return 0;
    15. }

    代码讲解: fseek(pf, 2, SEEK_SET);

                    这句代码意为:将文件指针指向文件内容开头位置,偏移量为2,偏移量0代表a,2代表0+2,即文件指针指向a之后的第2个字符c。

    练习2.要求输出字符f

    1. int main() {
    2. FILE* pf = fopen("file.txt", "r");
    3. if (pf == NULL) {
    4. printf("%s\n", strerror(errno));
    5. return 1;
    6. }
    7. char ch = 0;
    8. //方法1.
    9. fseek(pf, 2, SEEK_CUR);
    10. ch = fgetc(pf); //ch接收文件指针指向的内容,f字符
    11. printf("方法1:%c\n", ch);
    12. //方法2:
    13. fseek(pf, 5, SEEK_SET);
    14. ch = fgetc(pf); //ch接收文件指针指向的内容,f字符
    15. printf("方法2:%c\n", ch);
    16. //方法3:
    17. fseek(pf, -1, SEEK_END);
    18. ch = fgetc(pf); //ch接收文件指针指向的内容,f字符
    19. printf("方法3:%c\n", ch);
    20. fclose(pf);
    21. pf = NULL;
    22. return 0;
    23. }

    代码讲解:此代码打开文件的方式为:读文件

            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.代码实践:

    1. int main() {
    2. FILE* pf = fopen("file2.txt", "r");
    3. if (pf == NULL) {
    4. printf("%s\n", strerror(errno));
    5. return 1;
    6. }
    7. char ch = 0;
    8. //文件内容:abcdef
    9. fseek(pf, 2, SEEK_SET);
    10. ch = fgetc(pf);//ch接收文件指针指向的内容,c字符
    11. printf("%c\n", ch);
    12. printf("%d\n",ftell(pf));//3
    13. fseek(pf, -1, SEEK_END);
    14. ch = fgetc(pf);//ch接收文件指针指向的内容,f字符
    15. printf("%c\n", ch);
    16. printf("%d\n", ftell(pf));//
    17. fclose(pf);
    18. pf = NULL;
    19. return 0;
    20. }

     

    调试结果如下:

     

    代码讲解:此文件打开方式为:读文件 

                    结果为3的原因:因为ch接收了pf指向的位置的字符c,输出后,文件指针会自动跳到下一个字符d的位置,ftell函数就是计算指针当前位置相对于文件开头位置的偏移量距离。

                    结果为6的原因:ch接收了文件指针指向的字符f后,自动向后,指向了末尾位置,ftell函数计算了末尾位置相对于文件开头位置的偏移量距离为6,偏移量距离为0表示第一个文件内容a;偏移量距离为5,表示文件内容中第6个内容字符f。


    三.rewind函数

     

    1.功能:

    让文件指针的位置回到文件的起始位置。

    2.代码实践:

    1. int main() {
    2. FILE* pf = fopen("file2.txt", "r");
    3. if (pf == NULL) {
    4. printf("%s\n", strerror(errno));
    5. return 1;
    6. }
    7. char ch = 0;
    8. // //文件内容:abcdef
    9. //练习1.要求输出字符c
    10. fseek(pf, 2, SEEK_SET);
    11. ch = fgetc(pf);//ch接收文件指针指向的内容,c字符
    12. printf("%c\n", ch);
    13. printf("%d\n", ftell(pf));//偏移量为3
    14. rewind(pf);//让文件指针回到文件起始位置
    15. printf("%d\n", ftell(pf));
    16. printf("----------------\n");
    17. fseek(pf, -1, SEEK_END);
    18. ch = fgetc(pf);//ch接收文件指针指向的内容,f字符
    19. printf("%c\n", ch);
    20. printf("%d\n", ftell(pf));//6
    21. rewind(pf);//让文件指针回到文件起始位置
    22. printf("%d\n", ftell(pf));//0
    23. fclose(pf);
    24. pf = NULL;
    25. return 0;
    26. }

     

     

    好了,这三个函数的功能与用法就讲到这里,大家觉得有用的话记得点个三连哟~,下期见!

  • 相关阅读:
    视频监控/安防监控平台EasyCVR(V.3.4.0)界面更新大曝光,速来抢先看!
    基于matlab的一级倒立摆直线运动稳定性控制仿真
    代码随想录算法训练营第三天|LeetCode 203.移除链表元素 、707.设计链表 、206.反转链表
    mapstruct实体转换 转换成不同类型
    PyTorch搭建Transformer实现多变量多步长时间序列预测(负荷预测)
    Vue Router 嵌套路由
    hadoop 编写开启关闭集群脚本, hadoop hdfs,yarn开启关闭脚本。傻瓜式hadoop脚本 hadoop(九)
    sklearn学习笔记之线性回归
    java-php-python-ssm校园社团管理系统计算机毕业设计
    【AI绘画】Stable Diffusion WebUI
  • 原文地址:https://blog.csdn.net/weixin_69283129/article/details/126164935