资讯动态

VSCODE——文件io输入输出

发布时间:2026/10/23 7:58:35 来源:尧图企业网站定制
文件io操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用systemcallc库是为了通用(跨平台linuxwin )而设计的函数接口。systemcall 直接可以使用linux系统提供的功能。 c库是对 systemcall 的封装。c库的函数会调用systemcall中的函数标准io 文件io的区别.1 没有缓存区 文件io更适合操作 设备文件。.2 操作对象不在是文件流指针而是文件描述符(很小的非负的整数 0-1023 )每个程序在启动的时候操作系统默认为其打开三个描述符与流对象匹配0 STDIN_FILENO stdin1 STDOUT_FILENO stdout2 STDERR_FILENO stderrstdin,stdout,stderr,FILEopen是最底层内核调用内核只使用整数fd来标识打开的文件FILE* 是C标准库在fd外面额外套的一层包装只有fopen这套标准IO才会用到FILE*open1 int open(const char *pathname, int flags, int mode);2 功能3 获得一个文件描述符4 参数5 pathname:文件名6 flags:7 O_RDONLY 只读8 O_WRONLY 只写9 O_RDWR 又读又写10 O_CREAT创建文件11 O_EXCL需要和O_CREAT同时使用表示新建的文件不能存在否则open就会失败12 O_NOCTTY,不是终端设备13 O_TRUNC文件内容清空14 O_APPEND追加15 O_ASYNC异步io什么时候io不确定。16 O_NONBLOCK非阻塞18 返回值19 成功返回文件描述符20 失败返回-1使用如下#include stdio.h #includesys/types.h //定义mode_t等基础类型 #includesys/stat.h //文件权限相关 #includefcntl.h //放open原型O_RDONLY/O_CREAT这些宏 int main(int argc, char **argv) { int num 1280323; int fd open(1.txt,O_WRONLY|O_CREAT|O_TRUNC,0666); if(-1 fd) { printf(open error\n); return 1; } return 0; }理解 按位或的原因是他们本质都是单个bit置1的整数宏每个功能都要使用所以这样可以当成只写的固定搭配O_WRONLY → 0000 0001O_CREAT → 0000 0010O_TRUNC → 0000 01000666来源权限分3类人所有者、同组、其他人权限值- 4 r 读​- 2 w 写​- 1 x 执行6 4 2 → r w没有执行权限所以一个6 rw-0666拆开- 第一个6所有者 → rw-​- 第二个6同组用户 → rw-​- 第三个6其他人 → rw-前面的0代表这是八进制数C语言里以0开头代表八进制所以 0666 rw-rw-rw-写出来是0666但是实际上效果是0664因为这是给各种访问者设置权限所以有 O_CREAT才要权限没有 O_CREAT不要 0666umask 0002最常见默认值umask 含义要屏蔽掉、取消掉的权限umask 0002 → 取消「其他用户的写权限」目标权限 0666~umask把umask按位取反 → ...~0002111 111 101 110 110 110 0666结果0664 权限 rw-rw-r--write1 size_t write(int fd, const void *buf, size_t count);2 功能3 通过文件描述符向文件中写一串数据4 参数5 fd:文件描述符6 buf:要写入文件的数据的首地址7 count:要写入字符的个数(buf中实际内容的长度)8 返回值9 成功返回实际写入的个数10 失败返回-1write使用例子#include stdio.h #includesys/types.h #includesys/stat.h #includefcntl.h #includeunistd.h //writereadclose函数的头文件 #includestring.h int main(int argc, char **argv) { int num 1280323; int fd open(1.txt,O_WRONLY|O_CREAT|O_TRUNC,0666); if(-1 fd) { printf(open error\n); return 1; } char buf[256] hello,are you; write(fd,buf,strlen(buf)); return 0; }read1 size_t read(int fd, void *buf, size_t count);2 功能3 通过文件描述符从文件读取一串数据4 参数5 fd:文件描述符6 buf:存放读到数据的缓冲区首地址7 count:想要读取的字节个数8 返回值9 成功返回读到的字节个数10 读到文件末尾返回011 失败返回-1read使用例子#include stdio.h #includesys/types.h #includesys/stat.h #includefcntl.h #includeunistd.h #includestring.h int main(int argc, char **argv) { int num 1280323; int fd open(1.txt,O_RDONLY); if(-1 fd) { printf(open error\n); return 1; } while(1) { char buf[256] {0}; int ret read(fd,buf,sizeof(buf)); if(ret 0) { break; } printf(ret is %d,buf:[%s]\n,ret,buf); } close(fd); return 0; }lseek1 off_t lseek(int fd, off_t offset, int whence);2 功能3 定位光标的位置4 参数5 fd:文件描述符6 offset:偏移量7 正:向后偏移8 负:向前偏移9 零:不偏移10 whence:11 SEEK_SET12 SEEK_CUR13 SEEK_END14 返回值15 成功返回偏移量16 失败返回-1lseek使用例子#include stdio.h #includesys/types.h #includesys/stat.h #includefcntl.h #includeunistd.h #includestring.h int main(int argc, char **argv) { int fd open(1.txt,O_RDONLY); if(-1 fd) { printf(open error\n); return 1; } off_t off lseek(fd,0,SEEK_END); printf(size is %ld\n,off); lseek(fd,0,SEEK_SET); char c 0; read(fd,c,1); printf(%c\n,c); close(fd); return 0; }

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑