操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用 其中有个 文件IO, 一般都是对设备文件操作,当然也可以对普通文件进行操作。一个基于Linux内核的没有缓存的IO机制,文件IO没有缓冲区。
1.文件IO的特性
(1)没有缓存区
(2)操作对象不在是流,而是文件描述符
(3)文件描述符:很小的非负的整数 int 0-1023,内核每打开一个文件就会获得一个文件 描述符
每个程序在启动的时候操作系统默认为其打开
三个描述符与流对象匹配:
0 ==>STDIN_FILENO === stdin
1 ==>STDOUT_FILENO == stdout
2 ==>STDERR_FILENO == stderr
stdin,stdout,stderr,===>FILE*
ansi c
unistd.h ===>POSIX 标准库
2.标准IO和文件IO的后缀
w == O_WRONLY | O_CREAT | O_TRUNC
w+ == O_RDWR | O_CREAT | O_TRUNC
r == O_RDONLY
r+ == O_RDWR
a == O_WRONLY | O_CREAT | O_APPEND
a+ == O_RDWR|O_CREAT|O_APPEND
3.文件IO的操作流程
(1)打开:open
(2)读写:read / write
(3)关闭:close
4.函数
(1)open函数
头文件:#include <sys/types.h>
一般形式:open("文件名", O_WRONLY | O_CREAT |O_TRUNC, 0666);
如果有O_CREAT,则需要写权限,一般文件权限给0666(八进制)
返回值是一个文件描述符
(2)write函数
头文件:#include <unistd.h>
一般形式:int fd = open(.......);
char buf[128] = "hello";
write(fd, buf, strlen / sizeof(buf));
如果是字符型数组,用stelen,写入有效字符,如果用sizeof,会把128个字节全部写入,除有效字符外全为空字符
返回值是实际写入的个数
(3)read函数
头文件:#include <unistd.h>
一般形式:int fd = open(........);
char buf[128] = "hello";
read(fd, buf, sizeof(buf));
read函数只会读出能读到的位置,不会跟write函数一样
返回值是实际读到的字节数
(4)lseek函数
头文件:#include <sys/types.h> #include <unistd.h>
一般形式:lseek(fd, 偏移个数,SEEK_SET)
类似于fleek函数,返回值是off_t,是长整型,打印的时候用%ld,偏移后写入默认是覆盖写