Linux下的软件编程——文件IO

文件IO ----系统调用

linux内核专门为应用层提供的文件操作方法

1.打开文件 ------open

2.读写文件 ------read \ write

3.关闭文件 ------close

int open(const char *pathname,int flags,mode_t mode)

(1)功能:打开文件并获得一个文件描述符

(2)参数:pathname:要打开的文件的文件名

flags:打开方式

mode:文件读写操作权限(当flags中有O_CREAT标志时必须增加mode)0777 0664

(3)返回值:成功:返回一个文件描述符

失败:返回-1

文件IO的打开方式:O_RDONLY:只读方式 O_WRONLY :只写方式 O_REWR:可读写方式 O_CREAT:创建文件 O_TRUNC:清空文件 O_APPEND:追加写

" r " <----> O_RDONLY " r+ " <----> O_RDWR

" w " <----> O_WRONLY | O_CREAT | O_TRUNC,0664

" w+ " <----> O_RDWR | O_CREAT | O_TRUNC,0664

" a " <----> O_WRONLY | O_APPEND | O_TRUNC,0664

" a+ " <----> O_RDWR | O_APPEND | O_TRUNC,0664

系统默认打开的文件占用0,1,2这三个文件描述符

标准IO 文件IO

FILE * ------> int

stdin(标准输入设备) 0

stdout(标准输出设备) 1

stderr(标准出错设备) 2

文件描述符:操作系统中已打开文件的标识符(小的非负的整形数据)

范围:0---1023(总共1024个)

分配原则:最小未被使用原则

文件描述符泄露:已打开的文件,使用完时,未及时关闭

int close(int fd)

功能:关闭文件

size_t write(int fd,const void *buf,size_t count)

(1)功能:向文件中写入数据

(2)参数:fd:文件描述符

buf:被写入数据的首地址

count:写入数据的字节数

(3)返回值:成功:写入的字节数

失败:返回-1

size_t read(int fd,const void *buf,size_t count)

(1)功能:从文件中读数据

(2)参数:fd:文件描述符

buf:存储数据的空间首地址

count:希望读取的字节数

(3)返回值:成功:返回实际读到的字节数

失败:返回-1

读到文件末尾:返回0

文件定位函数:

off_t lseek(int fd,off_t offset,int whence)

(1)功能:文件读写位置定位

(2)参数:fd:文件描述符

offset:偏移量

whence:要偏移的相对位置(SEEK_SET,SEEK_CUR,SEEK_END)

(3)返回值:成功:返回当前读写位置到开头的距离

失败:返回-1

求文件的大小:

off_t len = lseek(fd,0,SEEK_END)

lseek(fd,0,SEEK_SET) ---> 文件读写位置复位

标准IO与文件IO的不同点

标准IO:1.属于C库函数,移植性强

2.标准IO是系统调用的一次封装,增加了缓冲区,目的是提高数据读写的效率

3.标准IO主要用在对普通文件的操作上

文件IO:1.属于系统调用,只能用于linux操作系统,移植性弱

2.文件IO无缓冲区

3.文件IO主要应用在对硬件的操作,也可以操作普通文件

缓冲区

1.行缓冲 1k(1024字节) --->人机交互界面,终端

缓冲区被刷新的方式:(1)程序结束,自动刷新缓冲区(2)遇到\n刷新(3)fflush()强制刷新

(4)缓冲区满刷新

2.行缓冲 4k(4096字节) ---> 文件缓冲区

缓冲区被刷新的方式:(1)程序结束,自动刷新缓冲区(2)fflush()强制刷新

(3)文件关闭刷新(4)缓冲区满刷新

3.无缓冲 0k ---> 出错信息对应的设备

例如:stderr---> 无缓冲

相关推荐
老华带你飞2 分钟前
个人网盘管理|基于springboot + vue个人网盘管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
宸津-代码粉碎机3 分钟前
告别繁琐SQL!MyBatis - Flex让数据库操作“飞”起来
java·服务器·tomcat
云声风语3 分钟前
buuCTF练习题misc大白记一次vim配合xxd使用
linux·编辑器·vim
南棱笑笑生3 分钟前
20251219给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-5.10】后解决启动不了报atf-2的问题
linux·c语言·开发语言·rockchip
艾莉丝努力练剑10 分钟前
【Linux进程(四)】深入理解 Linux O(1) 调度器:双队列轮转与进程优先级机制——如何避免进程饥饿,实现公平且高效的进程调度
java·大数据·linux·运维·服务器·人工智能·安全
好评1241 小时前
Linux入门:软件包管理、Vim、GCC、Makefile、Git 与 GDB
linux·运维·服务器
郑州光合科技余经理1 小时前
PHP构建:支撑欧美澳市场的同城生活服务平台开发
java·开发语言·数据库·uni-app·php·排序算法·生活
可爱又迷人的反派角色“yang”2 小时前
ansible剧本编写(三)
linux·网络·云计算·ansible
石像鬼₧魂石7 小时前
内网渗透靶场实操清单(基于 Vulhub+Metasploitable 2)
linux·windows·学习·ubuntu
Danileaf_Guo8 小时前
256台H100服务器算力中心的带外管理网络建设方案
运维·服务器