常见 FILE C库函数
一、fopen
FILE *fopen(const char *filename, const char *mode);
- 功能:打开文件;
- 参数:filename:指定要打开的文件名,建议绝对路径;
- mode:打开文件指定的方式;
返回值:返回 FILE* 类型的结构指针;
Mode :
r —— 只读方式 打开文件;read
r+ —— 读、写 方式打开文件; read+
w ——只写方式 打开文件,文件存在则文件长度清零,不存在则创建; write
w+ —— 读写方式 打开文件,文件存在则文件长度清零,不存在则创建; write+
a —— 打开只写文件,文件存在则追加,不存在则创建; append
a+ —— 打开 读写 文件,文件存在则追加,不存在则创建; append+
b ——跟以上方式联合使用 :rb,rb+,wb,wb+,ab,ab+
二、fclose
FILE *fclose(FILE *fp);
- 功能:关闭文件;
- fp: 打开文件对应的 FILE 指针;
- 返回值:成功返回0,失败返回 -1;
三、fread
unsigned long fread(void *ptr, unsigned long size, unsigned long nmemb, FILE *stream);
- 功能:从文件读取数据,从硬件上将数据读取到内存中保存;
- ptr:存放的首地址
- size:读取单个数据块的大小:如4字节
- nmemb:写入数据块的个数
- stream:文件指针
- 返回值:失败返回-1,写入后返回实际读取个数
四、fwrite
unsigned long fwrite(const void *ptr, unsigned long size, unsigned long nmemb, FILE *stream);
- 功能:向文件写入数据
- ptr:首地址
- size:单个数据块的大小:如4字节
- nmemb:写入数据块的个数
- stream:传递文件指针
- 返回值:失败返回-1,写入后返回实际写入个数
五、fseek
int fseek(FILE *stream, long int offset, int whence);
- stream:文件游标
- offset:从文件那个地址开始,相对地址
- fromwhere:需要指定以下宏,开始地址
SEEK_SET:文件头:
SEEK_CUR:当前位置
SEEK_END:文件尾
六、rewind
void rewind(FILE *stream);
- 功能:将文件指针 fp 定位到开头
七、实际使用
这些函数均从C标准库调用:
理解以下就是:用户态通过C库访问内核态,进行文件相关操作;
#include <stdio.h>
int main(void)
{
int a[]={1,2,3,4,5,6,7,8};
int len=sizeof(a)/sizeof(a[0]);
int size=0;
//打开文件,好习惯, fp为文件中的游标,初始定位在文件头
FILE *fp=NULL;
fp=fopen("/home/yujinlong/stdc/a.bin","w+"); //.bin为二进制文件
if(NULL==fp){
printf("文件打开失败.\n");
return -1;
}
//把数组的数据(内存中),写入文件中(硬盘)
size=fwrite(a,sizeof(int),len,fp); //每次写完后,fp 文件指针往后挪
printf("实际写入数据块=%d.\n",size); // 打印 8
//将文件游标重新定位到开头
rewind(fp);
//把文件中的数据(硬盘)上读取到内存并打印输出
int b[8]={0}; //用于保存读取到的数据
size=fread(b,sizeof(int),8,fp);
printf("实际读取了int数据:=%d.\n",size); //打印 8
for(int i=0;i<size;i++){
printf("%d",b[i]); //打印 1 2 3 4 5 6 7 8
}
//将文件指针游标从文件头定位到后面8个字节位置;
//1 2 3 4 5 6 7 8
int c[2]={0};
fseek(fp,8,SEEK_SET);//从头开始数,8个字节,刚好 fp定位到“3”
fread(c,sizeof(int),2,fp); //从fp读取2个字节,保存到C,C[0]=3,C[1]=4;
//关闭文件
fclose(fp);
return 0;
}
总结
- 内核驱动偶尔会用到此库函数,相较于open等直接通过系统调用操作内核的方式,C库封装后执行效率更高一些,进行过优化。