美文网首页
文件IO操作

文件IO操作

作者: chenwr2018 | 来源:发表于2019-03-01 19:43 被阅读0次
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    char s_readbuf[100];
    char *ADP_NET_GetModuleVer_SW()
    {
        FILE *fp = NULL;
        int len;
        fp = fopen("./version", "r");
        if (!fp) {
            printf("fopen error\n");
            return 0;
        }
        fseek(fp, 0, SEEK_END);
        len = ftell(fp);
        rewind(fp);
        fread(s_readbuf, 1, len-1, fp);//len-1 去除换行符
        s_readbuf[len] = '\0';
        fclose(fp);
        fp = NULL;
        return s_readbuf;
    }
    void main()
    {
        char *buf = NULL;
    
        buf = ADP_NET_GetModuleVer_SW();
        printf("file content: %s\n", buf);
    }
    

    知识点说明

    一、fopen

    (1)函数原形

    FILE * fopen(const char * path, const char * mode);

    (2)参数mode


    参数mode说明

    (3)二进制和文本模式的区别

    • 在Windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用 fputs 等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n"。
    • 在类 Unix/Linux 系统中文本模式下,文件以"\n"代表换行。所以 Linux 系统中在文本模式和二进制模式下并无区别。

    (4)返回值

    文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回 NULL,并把错误代码存在 error 中。

    (5)注意事项

    • 在定义文件指针时,要将文件指针指向空;如 FILE *fp = NULL
    • 在文件操作完成后,别忘记fclose,否则会造成内存泄漏和在下次访问文件时出现问题。
    • 文件关闭后,需要将文件指针指向空,这样做会防止出现游离指针,而对整个工程造成不必要的麻烦;如:fp = NULL

    二、fseek

    (1)函数原形

    int fseek(FILE *stream, long offset, int fromwhere);

    (2)参数说明

    第一个参数stream为文件指针
    第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
    第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET

    SEEK_SET: 文件开头
    SEEK_CUR: 当前位置
    SEEK_END: 文件结尾

    其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.

    简言之:
    fseek(fp,100L,0);把stream指针移动到离文件开头100字节处;
    fseek(fp,100L,1);把stream指针移动到离文件当前位置100字节处;
    fseek(fp,-100L,2);把stream指针退回到离文件结尾100字节处。

    (3)返回值

    • 如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。
    • 如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置,函数返回-1,设置error的值,可以用perror()函数输出错误。

    (4)注意事项

    • 文件指针操作文件,会直接覆盖原先的内容。fread fwrite操作都会对文件指针进行偏移。
    • 实现文件内容中插入字符串,先定位到要插入的文件指针位置,将之后的内容保存在缓存中,插入目标字符串后再把文件缓存的内容添加。
    • 函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。配合fseek使用。会计算换行符的长度
    • 计算完文件长度后,记得rewind(将文件内部的位置指针重新指向一个流(数据流/文件)的开头)。等价于fseek(stream, 0L, SEEK_SET)。

    三、fread

    (1)函数原形

    size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;

    (2)参数说明

    buffer 用于接收数据的内存地址
    size 要读的每个数据项的字节数,单位是字节
    count 要读count个数据项,每个数据项size个字节.
    stream 输入流

    (3)返回值

    个人理解为返回数据项数

    char *ADP_NET_GetModuleVer_SW()
    {
        FILE *fp = NULL;
        int len;
        int ret;
    
        fp = fopen("./version", "r");
        if (!fp) {
            printf("fopen error\n");
            return 0;
        }
        fseek(fp, 0, SEEK_END);
        len = ftell(fp);
        rewind(fp);
        ret = fread(s_readbuf, 1, len-1, fp);//len-1 去除换行符
        printf("len = %d\n", len);
        printf("fread ret = %d\n", ret);
        //fread(s_readbuf, len-1, 1, fp);
        s_readbuf[len] = '\0';
        fclose(fp);
        fp = NULL;
        return s_readbuf;    
    }
    void main()
    {
        char *buf = NULL;
        int ret;
        buf = ADP_NET_GetModuleVer_SW();
        printf("file content: %s\n", buf);
    }
    

    运行结果:

    len = 28
    fread ret = 27
    file content: plt-ec20-0.01
    plt-ec20-0.02
    

    当使用 fread(s_readbuf, 1, len, fp),当len小于fp文件中实际的长度,fread的返回值为len,当len大于fp文件中实际的长度。fread的返回值为文件fp实际的长度。

    修改为:ret = fread(s_readbuf, 1, 50, fp);
    运行结果:
    len = 28
    fread ret = 28
    file content: plt-ec20-0.01
    plt-ec20-0.02
    
    修改为:ret = fread(s_readbuf, 1, 5, fp);
    运行结果:
    len = 28
    fread ret = 5
    file content: plt-e
    

    当使用 fread(s_readbuf, len, 1, fp),这种语句时,个人理解为读取一个数据项,数据项长度为参数2,当fp文件长度小于len,则说明没有读取完整一个数据项,返回值为0。反之说明已经读取完整一个数据项,返回值为1。

    修改为:ret = fread(s_readbuf, 50, 1, fp);
    运行结果:
    len = 28
    fread ret = 0
    file content: plt-ec20-0.01
    plt-ec20-0.02
    
    修改为:ret = fread(s_readbuf, len, 1, fp);
    运行结果:
    len = 28
    fread ret = 1
    file content: plt-ec20-0.01
    plt-ec20-0.02
    

    4、fwrite

    (1)函数原形

    size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

    (2)参数说明

    • buffer:是一个指针,对fwrite来说,是要获取数据的地址;
    • size:要写入内容的单字节数;
    • count:要进行写入size字节的数据项的个数;
    • stream:目标文件指针;
    • 返回实际写入的数据项个数count。

    (3)返回值

    返回实际写入的数据块数目

    相关文章

      网友评论

          本文标题:文件IO操作

          本文链接:https://www.haomeiwen.com/subject/zdejuqtx.html