嵌入式Linux应用开发 2.系统编程 标准IO:fopen fclose fwrite fread

边学边看边记

标准IO

1.标准IO和文件IO的区别
文件IO:是直接调用内核提供的系统调用函数,头文件是unistd.h
标准IO:是间接调用系统调用函数,头文件是stdio.h
2.三个缓存的概念
<1>用户空间的缓存:我们程序中的缓存,就是你想从内核读写的缓存(数组)
<2>内核空间缓存:每打开一个文件,内核在内核空间中也会开辟一块缓存空间
(1)文件IO的写即是将用户空间中的缓存写到内核空间缓存
(2)文件IO的读即是将内核空间的缓存写到用户空间缓存之中
<3> 库缓存:标准IO中存在的缓存空间
在使用标准IO的思想去编程时候,它就属于一个桥梁,有点转运蛋白的感觉,在用户空间的缓存和内核空间的缓存之间做一个过度。但是数据的传送是需要一定的条件的。
(1)printf满足一定的条件,当用到\n的时候,即会将库缓存的内容写到内核缓存之中,这个过程调用了系统库函数write.
(2)当系统的库缓存写满以后,会调用系统调用函数,将库缓存中的数据写入内核缓存之中。
注:库缓存也就是printf最多缓存1KB也就是1024个字节。当超出这个字节数将出现上面的情况。
3.标准IO-fopen和fclose
<1>FILE *fopen(const char path,const char mode)
返回值:FILE
文件流指针 类似于文件IO中的文件描述符
在文件IO中,open的返回值是文件的id(文件描述符)号,也就是说不同的文件id号是不同的,在标准io中不同的文件FILE
指针是不一样的。
FILE定义:struct_IO_FILE,在/usr/include/libio.h
包含读写缓存的首地址,大小,位置指针等。它是一个结构体
https://blog.csdn.net/cywosp/article/details/38965239
当我们通过文件IO打开一个文件的时候,系统内核就会自动的给文件生成三个文件描述符:
0:输入流0:标准输入流 stdin
1:输出流1:标准输出流 stdout
2:出错流2:标准错误流 stdeer
<2>函数中存在的两个参数,第一个参数 和open中的第一个参数的意义是一样的
第二个参数模式也和open十分的相似
b:二进制文件
r:只读方式打开文件,文件必须存在
w或a:只写方式打开文件,文件不存在则创建
区别:w等价O_TRUNC(打开后先将文件中的内容删除) a等价O_APPEND(打开文件后在文件已有的内容基础上去添加)
+:读写方式打开文件,文件必须存在
fopen设置的文件默认权限是0666
<3>用fopen实现touch
在这里插入图片描述
在这里插入图片描述
4.标准IOfread和fwrite
全缓存:size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE stream);
功能:全缓存的读写函数
第一个参数buf:写的内容
第二个参数size:写的内容,每一个单元所占的字节数
第三个参数nmemb:写的内容中,有多少个单元数
第四个参数stream:写到哪里去
总共写多少个字节:size
nmemb
返回值:实际读写的单元数

理论上全缓存就是,当我们在用户空间写数据,这些数据就会传入到库缓存中,当库缓存写满后,才会进入内核驱动层的内核缓存空间中去,内核缓存在进行和硬件的交互。但是我们用到了fclose这个标准IO,它可以不用等到库缓存写满,就可以将我们想写入文件的内容直接传到内核缓存空间之中。
<1>fwrite
在这里插入图片描述
在这里插入图片描述
<2>fread
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值