文件I/O基本操作——东写西读南开北关中位移
Linux王国曾经有那么一个风起云涌的年代,而在那一个年代里就有那么五位人中龙凤掀起无数的波澜,人们称他们为东写西读南开北关中位移
在Linux的文件操作中主要用到底层I/O操作和标准I/O操作
能否熟练地掌握底层I/O操作决定着开发者小白是否能远离在程序里面写一大堆字符串的问题。
同时还决定了在嵌入式程序设计、多路I/O操作程序设计,TCP/IP的socekt套字节程序设计领域里技术的高低
名称 | 说明 |
---|---|
底层文件I/O操作 | 不带缓存,每个文件操作动作都调用内核中的相应系统调用 通过文件描述符来访问文件 |
标准文件I/O操作 | 标准I/O库的所有操作都是围绕流来进行的,在标准FILE *来描述,每个被使用的文件都在内存中开辟一个区域,用存放文件的有关信息,这些信息是保持在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE |
底层I/O里面有着五个重要的函数,我将其称为东写西读南开北关中位移
这五个函数让我们把各种文件玩弄于股掌之中
底层I/O函数 | 函数说明 |
---|---|
write() | 用于向打开的文件写数据,写操作从文件的当前指针位置开始 |
read() | 用于将从指定的文件描述符中读出的数据放到缓存区中,并返回实际读入的字节数 |
open() | 用于打开或创建文件。在打开或创建文件时可以指定文件的属性及用户的权限等各种参数 |
close() | 用于关闭一个被打开的文件。当一个进程终止时,所有被它打开的文件都由内核自动关闭,很多程序都使用这一功能而不显示关闭一个文件 |
lseek() | 用于在指定的文件描述符中将文件指针定位到相应的位置,仅能用于可定位的文件中 |
东写(向文件写入数据)
东写(write)可以将内力(数据)注入到文件之中,让他们在里面不断流转,生生不息
所需头文件 | #include<unistd.h> |
函数原型 | ssize_t write(int fd, void *buf, size_t count) |
函数传入值 | fd:文件描述符 |
buf:存储内容的内存空间 | |
count:从buf指定读出的字节数 | |
函数返回值 | 0:成功 |
-1:失败 |
西读(从文件中读出数据)
西读(read)透心魂,摄魂魄,无论是谁都没办法在她面前说谎,妩媚的眼神能让人说出心中的一切秘密(数据)
所需头文件 | #include<unistd.h> |
函数原型 | ssize_t read(int fd, void *buf, size_t count) |
函数传入值 | fd:文件描述符 |
buf:存储内容的内存空间 | |
count:从文件中指定读出的字节数 | |
函数返回值 | 0:成功 |
-1:失败 |
南开(打开文件)
南开(open)开天辟地(打开文件),造化万物(创建新文件),所造之物皆可辨主(赋予权限),缺之则无后世之功(如果不用open打开文件,read、write、close和lseek就不能起作用)
所需头文件 | #include<sys/types.h> | |
#include<sys/stat.h> | ||
#include<fcntl.h> | ||
函数原型 | int open(const char* pathname, int flags) | |
int open(const char* pathname, int flags, int perms) | ||
函数传入值 | pathname | 被打开的文件名 |
flags(文件打开方式) | O_RDONLY 只读方式打开文件 | |
O_WRONLY 只写方式打开文件 | ||
O_RDWR 读写方式打开文件 | ||
O_CREAT 若文件不存在则创建文件,需要传入perms来设定权限 | ||
O_EXCL 与O_CREAT一起使用,检测文件是否存在,若文件存在则返回错误信息 | ||
O_APPEND 以添加的方式打开文件,并将文件指针置于文件尾 | ||
O_TRUNC 若文件存在,并以只读或只写打开,则会先删除文件中的数据 | ||
O_NOCTTY 若打开的文件为终端设备则不将此设备分配作为此进程的控制终端 | ||
O_SYNC 每次写操作时都会等到物理I/O操作完成 | ||
perms | 被打开的文件的存取权限,用八进制表示 | |
函数返回值 | 成功:返回文件描述符 | |
失败:-1 |
北关(关闭文件)
北关(close)平定心神,双手合十,一语道化天下波澜(关闭文件)
所需头文件 | #include<unistd.h> |
函数原型 | int close(int fd) |
函数传入值 | fd:文件描述符 |
函数返回值 | 0:成功 |
-1:失败 |
中位移(移动文件指针)
中位移(lseek)剑指八方论诸侯,进退无常断今后(设置文件指针)
所需头文件 | #include<sys/types.h> | |
#include<unistd.h> | ||
函数原型 | ssize_t lseek(int fd, off_t offest, int whence) | |
函数传入值 | fd | 文件描述符 |
offest | 偏移量(正数向文件尾移动,负数向文件头移动) | |
whence(起始点) | SEEK_SET:文件开头 + offset(一般为正) 为新读写位置 | |
SEEK_CUR:当前读写位置 + offset 为新读写位置 | ||
SEEK_END:文件结尾 + offset(一般为负) 为新读写位置 | ||
函数返回值 | 0:成功 | |
-1:失败 |
武学秘籍(头文件)
若无以下这四本秘籍,东写西读南开北关中位移这五位神通可掀不起什么波澜
(若要动用他们记得加上这些头文件哦!)
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
如果觉得这篇文章还不错的话,就点个赞收藏一下,感谢您的观看
看完底层I/O再来看看标准I/O吧!
文件标准I/O基本操作——FX乐曲时代_莫韵乐的Linux英雄传
如何科学养一只鸽子为你飞鸽传书——程序间异步通信_莫韵乐的Linux英雄传