南京高端网站建设工作室,网站建设在哪,国外的服务器建设的网站,自己做网站很难一、文件IO
#xff08;一#xff09;概念
文件IO就是系统调用#xff0c;用户空间进入内核空间的过程就是系统调用。 系统调用没有缓冲机制#xff0c;效率较低#xff0c;可移植性也相对较差#xff0c;实时性高。
文件描述符是使用open函数打开文件时的返回值…一、文件IO
一概念
文件IO就是系统调用用户空间进入内核空间的过程就是系统调用。 系统调用没有缓冲机制效率较低可移植性也相对较差实时性高。
文件描述符是使用open函数打开文件时的返回值一般叫做fd这个fd就代表这个打开的文件 以后对文件的读写操作就是通过这个文件描述符fd来完成的。 fd是一个整数在一个程序中文件描述符的范围0-1023共计1024个 使用uilmit -a 可以查看一个程序中可以打开的文件的个数限制 (open files 后面对应的就是 这个值也可以使用命令 ulimit -n 2048来修改 但一般都是用默认值) 在一个程序启动的过程中默认就会打开三个描述符(0 1 2) 如果再打开新文件一般是从3开始的
文件描述符 功能 0 标准输入 1 标准输出 2 标准出错
二open和close 函数的使用
1. open
#include sys/types.h
#include sys/stat.h
#include fcntl.h
int open(const char *pathname, int flags, mode_t mode);
功能使用文件IO的方式打开一个文件
参数pathname文件的路径和名字flagsO_RDONLY 只读的方式打开文件O_WRONLY 只写的方式打开文件O_RDWR 读写的方式打开文件----上面三个必须三选一 下面的是附加选项----O_APPEND 以追加的方式打开文件O_CREAT 如果文件不存在则新建这个文件如果指定了这个宏则第三个参数 mode 必须填mode代表的是创建文件的权限创建普通文件的最大权限为 0666也就是说我们给mode赋值 最大应该就为 0666但是实际上创建文件的权限还得涉及 掩码 umaskumask的值 默认为 0002 这个值也可以改的最终的权限 (mode ~umask)所以 即使给的是 0666 最终的权限也是 0664O_EXCL 需要和 O_CREAT 一起使用 如果文件不存在会创建文件如果文件存在会报错 错误码:EEXISTO_TRUNC 如果文件存在就清空mode代表文件的权限 一般用8进制表示
返回值成功 文件描述符(返回的文件描述符遵循未被打开的最小原则)失败 -1 重置错误码flags操作的原理
标准io文件io说明rO_RDONLY以只读的方式打开文件rO_RDWR以读写的方式打开文件wO_WRONLY|O_CREAT|O_TRUNC, 0666以只写的方式打开文件文件存在就清空不存在就新建wO_RDWRO_CREAT
2. close 函数的使用
#include unistd.h
int close(int fd);
功能关闭文件
参数fd文件描述符
返回值成功 0失败 -1 重置错误码三read/write函数
1. read
#include unistd.h
ssize_t read(int fd, void *buf, size_t count);
功能从文件fd中读取最多count个字节到buf中
参数fd文件描述符buf用来存放读到的内容的缓冲区的首地址count想要读取的字节数
返回值成功 实际读到的字节数(读到文件结束会返回0)失败 -1 重置错误码2. write
#include unistd.h
ssize_t write(int fd, const void *buf, size_t count);
功能把buf指向的内容写最多count个到文件fd中
参数fd文件描述符buf要写入的内容的首地址count想要写入的字节数
返回值成功 实际写入的字节数失败 -1 重置错误码四光标操作
#include sys/types.h
#include unistd.h
off_t lseek(int fd, off_t offset, int whence);
功能设置光标位置
参数fd文件描述符offset偏移量0 不偏移0 向后偏移0 向前偏移whence相对位置SEEK_SET 相对于文件开头SEEK_CUR 相对于当前位置SEEK_END 相对于文件结尾
返回值成功 光标新位置距离文件开头的偏移量失败 -1 重置错误码使用实例lseek(fd, 0, SEEK_SET);//将光标定位到文件开头lseek(fd, 0, SEEK_END);//将光标定位到文件结尾lseek(fd, 10, SEEK_CUR);//将光标向后偏移10个字节lseek(fd, -10, SEEK_CUR);//将光标向前偏移10个字节lseek(fd, 10, SEEK_SET);//将光标定位到文件开头第10个字节lseek(fd, -10, SEEK_END);//将光标定位到文件倒数第10个字节