==============================================================
这一篇非常详细,具体可以看这个https://www.cnblogs.com/fnlingnzb-learner/p/7040726.html
下面就对上面的文章进行简化修改
open和fopen的区别
1,fread是带缓冲的,read不带缓冲.
2,fopen是标准c里定义的,open是POSIX中定义的.
3,fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别.
4,fopen不能指定要创建文件的权限.open可以指定权限.
5,fopen返回文件指针,open返回文件描述符(整数).
open系统调用(linux)
需要包含头文件:
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
函数原型:
int open( const char * pathname, int oflags);
int open( const char * pathname,int oflags, mode_t mode);
mode仅当创建新文件时才使用,用于指定文件的访问权限
pathname 是待打开/创建文件的路径名;
oflags用于指定文件的打开/创建模式
O_RDONLY 只读模式
O_WRONLY 只写模式
O_RDWR 读写模式
以上三者是互斥的,即不可以同时使用。
打开/创建文件时,至少得使用上述三个常量中的一个。以下常量选用,选用方式O_RDONLY|O_APPEND
O_APPEND 每次写操作都写入文件的末尾
O_CREAT 如果指定文件不存在,则创建这个文件
O_EXCL 如果要创建的文件已存在,则返回 -1,并且修改 errno 的值,所以要判断文件是否存在,要O_CREAT和O_EXCL一起用
O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)。
//以下用于同步输入输出
O_DSYNC 等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
O_RSYNC read 等待所有写入同一区域的写操作完成后再进行
O_SYNC 等待物理 I/O 结束后再 write,包括更新文件属性的 I/O
第三个参数mode
这些标志在头文件sys/stat.h中定义,和文件的权限是一样的,可以用数字来代替,比如0777,0是代表8进制
但是填写了第3个参数后,得出来的文件的权限依然不是我们指定的,因为会有一个掩码,这个0777会和掩码取反后进行与的计算
得到实际权限,umask可以显示掩码,umask 数字 可以修改掩码,以下完全可以用数字代替
S_IRUSR: 读权限,文件属主
S_IWUSR: 写权限,文件属主
S_IXUSR: 执行权限,文件属主
S_IRGRP: 读权限,文件所属组
S_IWGRP: 写权限,文件所属组
S_IXGRP: 执行权限,文件所属组
S_IROTH: 读权限,其它用户
S_IWOTH: 写权限,其它用户
S_IXOTH: 执行权限,其它用户
返回值:成功则返回文件描述符,否则返回 -1。 返回文件描述符(整型变量0~255)
错误代码:
EEXIST 参数pathname 所指的文件已存在,却使用了O_CREAT和O_EXCL旗标。
EACCESS 参数pathname所指的文件不符合所要求测试的权限。
EROFS 欲测试写入权限的文件存在于只读文件系统内。
EFAULT 参数pathname指针超出可存取内存空间。
EINVAL 参数mode 不正确。
ENAMETOOLONG 参数pathname太长。
ENOTDIR 参数pathname不是目录。
ENOMEM 核心内存不足。
ELOOP 参数pathname有过多符号连接问题。
EIO I/O 存取错误
write函数
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
参数:
fd:要进行写操作的文件描述词。
buf:需要输出的缓冲区
count:最大输出字节计数
返回值:成功返回写入的字节数,出错返回-1并设置errno
read函数
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
参数:
buf:需要读取的缓冲区
count:最大读取字节计数
返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0 。
以下摘自:https://blog.csdn.net/songyang516/article/details/6779950
lseek函数
#include <sys/types.h>
off_t lseek(int filedes, off_t offset, int whence);
返回值:新的偏移量(成功),-1(失败)
所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数
参数 offset 的含义取决于参数 whence:
1. 如果 whence 是 SEEK_SET,文件偏移量将被设置为 offset。
2. 如果 whence 是 SEEK_CUR,文件偏移量将被设置为 cfo 加上 offset,
offset 可以为正也可以为负。
3. 如果 whence 是 SEEK_END,文件偏移量将被设置为文件长度加上 offset,
offset 可以为正也可以为负。
SEEK_SET、SEEK_CUR 和 SEEK_END 使用之前是 0、1 和 2。
lseek 的以下用法返回当前的偏移量:
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);
lseek还有一个作用,就是文件的扩展,但是文件扩展需要对文件最后进行一次写的操作
lseek(fd, 2000, SEEK_END);
write(fd,"a",1);