Bootstrap

标准C库函数:fopen(),fwrite(),fread(),fseek(),fclose()的基本用法。

一,简要概括与open()系列函数的区别

fopen()系列函数是是标准C语言库函数,因此拥有良好的移植性;

open()系列函数是UNIX系统调用,移植性有限。

详细内容请移驾链接内容:

https://www.cnblogs.com/NickyYe/p/5497659.html

二,函数头文件:

因为fopen(),fwrite(),fread(),fseek(),fclose()这一系列函数都是标准的C库函数,所以头文件都是:

#include <stdio.h>

三,函数原型:

fopen:   FILE *fopen(const char *pathname, const char *mode);

fwrite:   size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
fread:    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

fseek:    int fseek(FILE *stream, long offset, int whence);

fclose:   int fclose(FILE *stream);

🔺fopen()参数说明:FILE *fopen(const char *pathname, const char *mode);

① const char *pathname:文件名/路径,这是char型指针,须在”文件名/路径“上加上双引号;

② const char *mode:文件的操作权限,这里也是字符型指针,须在“操作权限”上加双引号;

权限用法
"r"以“只读”方式打开文件。只允许读取,不允许写入。文件必须存在, 否则打开失败。
"r+"以“读写”方式打开文件。既可以读取也可以写入,也就是随意 更新文件。文件必须存在,否则打开失败。
"w"以“写入”方式打开文件。如果文件不存在,那么创建一个新文件; 如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个 新文件)。
"w+"以“写入/更新”方式打开文件,相当于w和r+叠加的效果。既可 以读取也可以写入,也就是随意更新文件。如果文件不存在,那么 创建一个新文件;如果文件存在,那么清空文件内容(相当于删除 原文件,再创建一个新文件)。
"a"以“追加”方式打开文件。如果文件不存在,那么创建一个新文件 ;如果文件存在,那么将写入的数据追加到文件的末尾(文件原有的 内容保留)。
"a+"以“追加/更新”方式打开文件,相当于a和r+叠加的效果。既 可以读取也可以写入,也就是随意更新文件。如果文件不存在,那 么创建一个新文件;如果文件存在,那么将写入的数据追加到文件 的末尾(文件原有的内容保留)。


 

🔺fwrite()参数说明: size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

① const void *ptr:      ptr写入数据后存放地址;

② size_t size:            size是的块长度;

③ size_t nmemb:      nmemb是块的数量;

④ FILE *stream:       文件流

实际写入长度为size_t nmemb,返回值为块成功写入块的nmemb数量。

🔺fread()参数说明:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

① void *ptr:              读取数据后存放地址

② size_t size:           size是块长度

③ size_t nmemb:     是块的数量

④ FILE *stream:       文件流

实际读取长度为size_t nmemb,返回值为块成功读取块的nmemb数量。

🔺fseek()参数说明:int fseek(FILE *stream, long offset, int whence);

① FILE *stream :   文件流;

② long offset:        偏移位数;

③ int whence:        光标位置;

fseek()用法和lseek()的用法基本一样,详情可以参考链接内容:

https://blog.csdn.net/m0_74985965/article/details/128626066?spm=1001.2014.3001.5502

🔺fclose()参数说明:int fclose(FILE *stream);

用法:关闭文件,文件操作中必不可少的一步;

FILE *stream:文件流fp

四,代码实现:

① 对字符串进行读写操作;

#include <stdlib.h>
#include <string.h>


int main()
{
        FILE *fp;
        char *str = "qwertyuiop";//将字符串在地址str中
        char *readBuf = NULL;
        fp = fopen("./file1","w+");
        fwrite(str,sizeof(char),strlen(str),fp);//参照原型,有两种写法
//      fwrite(str,sizeof(char)*strlen(str),1,fp);

        int size = fseek(fp,0,SEEK_END);
        readBuf = (char *)malloc(sizeof(char)*size);
        fseek(fp,0,SEEK_SET);
        fread(readBuf,sizeof(char),strlen(str),fp);//两种写法,意义一样
//      fread(readBuf,sizeof(char)*strlen(str),1,fp);
        printf("%s\n",readBuf);
        fclose(fp);
        return 0;
}

② 对整型数进行读写操作:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
        FILE *fp;
        int data = 100;
        int data2 = 0;;
        fp = fopen("./file1","w+");
        fwrite(&data,sizeof(int),1,fp);

        fseek(fp,0,SEEK_SET);
        fread(&data2,sizeof(int),1,fp);
        printf("data2=%d\n",data2);
        fclose(fp);
        return 0;
}

③ 对结构体进行读写操作:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Test{
        int a;
        char c;
};
int main()
{
        FILE *fp;
        struct Test data = {100,'h'};
        struct Test data2;
        fp = fopen("./file1","w+");
        fwrite(&data,sizeof(struct Test),1,fp);

        fseek(fp,0,SEEK_SET);
        fread(&data2,sizeof(struct Test),1,fp);
        printf("a=%d,c=%c\n",data2.a,data2.c);
        fclose(fp);
        return 0;
}

④ 对结构体数组进行读写操作:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Test{
        int a;
        char c;
};
int main()
{
        FILE *fp;
        struct Test data[2] ={{100,'h'},{101,'j'}};
        struct Test data2[2];
        fp = fopen("./file1","w+");
        fwrite(&data,sizeof(struct Test)*2,1,fp);

        fseek(fp,0,SEEK_SET);
        fread(&data2,sizeof(struct Test)*2,1,fp);
        printf("a=%d,c=%c\n",data2[0].a,data2[0].c);
        printf("a=%d,c=%c\n",data2[1].a,data2[1].c);
        fclose(fp);
        return 0;
}

;