一,简要概括与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;
}