标准I/O与文件I/O的函数对比

在处理二进制数据的时候可以使用文件I/O,但对于处理字符串,标准I/O更加方便。
文件I/O是操作系统提供的API接口函数。文件I/O不提供缓冲机制。
文件I/O-文件描述符
- 每个打开的文件都对应一个文件描述符;
- 文件描述符是一个非负整数。Linux为程序中每个打开的文件分配一个文件描述符;
- 文件描述符从0开始分配,依次递增(0-1023);
- 文件I/O操作通过文件描述符来完成;
- 0:标准输入;1:标准输出;2:标准错误。
文件I/O-open
open函数用来创建或者打开一个文件:
#include <fcntl.h>
int open(const char *pathname,int flags);
int open(const char *pathname,int flag,mode_t mode);
成功返回文件描述符;出错时返回EOF;
- 打开文件时使用两个参数;
- 创建文件时第三个参数指定新文件的权限,(只有在建立新文件时有效)此外真正创建文件时的权限会受到umask值的影响,实际权限是mode-umaks;
- 可以打开设备文件,但是不能创建设备文件。
pathname:被打开的文件名;
flags :该参数可以是以下选项,多个使用 “|” 隔开:
- O_RDONLY: 以只读的方式打开
- O_WRONLY: 以只写的方式打开
- O_RDWR : 以读写的方式打开
- O_NONBLOCK: 打开时不阻塞
- O_APPEND: 以追加的方式打开
- O_CREAT: 创建并打开一个新文件
- O_TRUNC: 打开一个文件并截断它的长度为零(必须有写权限)
- O_EXCL: 如果指定的文件存在,返回错误
- O_NOCTTY:文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端
- O_SHLOCK: 自动获取共享锁
- O_EXLOCK: 自动获取独立锁
- O_DIRECT: 消除或减少缓存效果
- O_FSYNC : 同步写入
- O_NOFOLLOW: 不追踪软链接
mode:被打开文件的存取权限,为8进制表示法。
umask:用来设定文件或者目录发的初始权限
- 文件和目录的真正初始权限
- 文件或录的初始权限=文件或目录的最大默认权限-umask(0666-0002)
文件I/O-close
close函数用来关闭一个打开的文件:
#include <unistd.h>
int close(int fd);
- 成功时返回0;出错时返回EOF;
- 程序结束时自动关闭所用打开的文件;
- 文件关闭后,文件描述符不再代表文件。
文件I/O-read
read函数用来从文件中读取数据:
#include <unistd.h>
ssize_t read(int fd,void *buf,size count);
- 成功时返回实际读取的字节数,出错时返回EOF;
- 读到文件文件末尾时返回0;
- buf是接收数据的缓冲区;
- count不应该超过buf大小。
文件I/O-write
write函数用来向文件写入数据:
#include <unistd.h>
ssize_t write(int fd,void *buf,size_t count);
- 成功时返回实际写入的字节数;出错时返回EOF;
- buf是发送数据的缓冲区;
- count不应超过buf大小。
文件I/O-lseek
llseek函数用来定位文件:
#include <unistd.h>
off_t lseek(int fd,off_t offset,int whence)
- 成功时返回当前的文件读写位置;出错时返回EOF;
- 参数offset和参数whence同fseek完全一样
本文详细比较了标准输入/输出(标准IO)与操作系统提供的文件I/O函数,着重讲解了文件描述符、open()、close()、read()、write()等核心操作,并阐述了在处理字符串和二进制数据时各自的优势。
431

被折叠的 条评论
为什么被折叠?



