C -- 库函数

常见 FILE C库函数



一、fopen

FILE *fopen(const char *filename, const char *mode);
  1. 功能:打开文件;
  2. 参数:filename:指定要打开的文件名,建议绝对路径;
  3. 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);
  1. 功能:关闭文件;
  2. fp: 打开文件对应的 FILE 指针;
  3. 返回值:成功返回0,失败返回 -1;

三、fread

unsigned long fread(void *ptr, unsigned long size, unsigned long nmemb, FILE *stream);
  1. 功能:从文件读取数据,从硬件上将数据读取到内存中保存;
  2. ptr:存放的首地址
  3. size:读取单个数据块的大小:如4字节
  4. nmemb:写入数据块的个数
  5. stream:文件指针
  6. 返回值:失败返回-1,写入后返回实际读取个数

四、fwrite

unsigned long fwrite(const void *ptr, unsigned long size, unsigned long nmemb, FILE *stream);
  1. 功能:向文件写入数据
  2. ptr:首地址
  3. size:单个数据块的大小:如4字节
  4. nmemb:写入数据块的个数
  5. stream:传递文件指针
  6. 返回值:失败返回-1,写入后返回实际写入个数

五、fseek

int fseek(FILE *stream, long int offset, int whence);
  1. stream:文件游标
  2. offset:从文件那个地址开始,相对地址
  3. fromwhere:需要指定以下宏,开始地址

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

六、rewind

void rewind(FILE *stream);
  1. 功能:将文件指针 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;
}

总结

  1. 内核驱动偶尔会用到此库函数,相较于open等直接通过系统调用操作内核的方式,C库封装后执行效率更高一些,进行过优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值