• C语言fgetpos()函数:获得当前文件的读写指针(转)


    头文件:#include<stdio.h>

    fgetpos()函数获得当前文件的指针所指的位置,并把该指针所指的位置信息存放到pos所指的对象中。pos以内部格式存储,仅由fgetpos()和fsetpos()使用。fsetpos()的功能与fgetpos()相反,用来设置当前文件的指针。fgetpos()的原型为:
        int fgetpos( FILE *fp, fpos_t *pos );

    【参数】fp为当前文件流的指针,pos为指向fpos_t类型的指针。

    fpos_t是用来表示文件读写指针位置的类型,用来指明正在操作的文件中读或写的位置,文件头处为0。fpos_t在不同的平台下有不同的类型。

    在windows下,fpos_t是一个64位整数,可以直接赋值,如fpos_t = 12。

    在linux下,fpos_t是一个结构体,定义为:

    1. typedef struct
    2. {
    3. __off_t __pos; // 双下划线
    4. __mbstate_t __state;
    5. }fpos_t;

    fpos_t.__pos才是指向当前位置的整数,可以进行赋值,如 fpos_t.__pos = 12。

    【返回值】成功返回0,失败返回非0,并设置errno。

    【实例】window上应用fgetpos函数取得当前文件的指针所指的位置。

    1. #include <string.h>
    2. #include <stdio.h>
    3. int main(void)
    4. {
    5. FILE *fp;
    6. char string[] = "This is a test";
    7. fpos_t pos;
    8. // 以读写方式打开一个名为test.txt的文件
    9. fp = fopen("test.txt", "w+");
    10. //将字符串写入文件
    11. fwrite(string, strlen(string), 1, fp);
    12. // 取得指针位置并存入&pos所指向的对象
    13. fgetpos(fp, &pos);
    14. printf("The file pointer is at byte %ld ", pos);
    15. // 重设文件指针的位置
    16. fseek(fp,3,0);
    17. // 再次取得指针位置并存入&pos所指向的对象
    18. fgetpos(fp, &pos);
    19. printf("The file pointer is at byte %ld ", pos);
    20. fclose(fp);
    21. return 0;
    22. }

    运行结果:
    The file pointer is at byte 14
    The file pointer is at byte 3

    首先,程序以读写方式打开一个名为test.txt的文件,并把字符串"This is a test"写入文件。注意:字符串共14个字节,地址为0~13。用fwrite函数写入后,文件指针自动指向文件最后一个字节的下一个位置。即这时的fp的值应该是14。

    再用fgetpos函数取得指针位置并存入&pos所指向的对象,此时, pos中的内容为14。然后在屏幕上显示出The file pointer is at byte 14。

    再用fseek函数重设文件指针的位置,让fp的值为3,即指向文件中第4个字节。

    再次取得指针位置并存入&pos所指向的对象。然后在屏幕上显示出The file pointer is at byte 3。

    注意:在linux下,不能这样定义pos:
        fpos_t  *  pos;
        fgetpos(fp,pos);
    必须这样定义:
        fpos_t  pos;
        fgetpos(fp,&pos);

    因为pos必须是一个分配好内存空间的参数。第一种方式仅仅是定义了一个指针,并没有分配空间。如果改为下面的定义方式,则可以编译通过:
        fpos_t  *  pos;
        pos = (fpos_t)malloc(12);
        fgetpos(fp,pos);

  • 相关阅读:
    Devexpress [汇总链接]
    [转]修改LayoutControlitem容器内的控件长宽
    How to hide border of XtraTabControl
    CEF / Chromium 重新编译2018 官网地址 一路是坑 千万别跟着官方step by step走一定多思考多查资料 因为改动地方太多了编译都每个版本都不一样
    c#:配置引用程序集的路径(分离exe和dll)和 如何处理[dllImport]中的程序集的加载 [笔记]
    [redis] -- 缓存雪崩和缓存穿透、缓存击穿问题解决方案篇
    [redis] -- 为什么那么快
    [redis] -- 集群篇
    [spring cloud] -- 服务注册与服务发现篇
    [spring cloud] -- 核心篇
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/6254515.html
Copyright © 2020-2023  润新知