文件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---> 无缓冲