标准文件IO:fopen()、fclose()、fread()、fwrite()、fseek()
系统文件IO:open()、close()、read()、write()、lseek()
标准文件IO都是C标准库当中的函数,称之为库函数,是对系统调用的封装,方便二次开发
系统文件IO都属于系统提供的接口,称之为系统调用接口
标准文件IO只能读写普通文本文件和二进制文件,
系统文件IO不仅可以读写普通文件和二进制文件,还可以读写系统底层设备文件;加锁的文件必须使用系统文件IO读写,特殊的文件,比如管道,socket也必须使用read、write系统文件IO读写
标准文件IO读写文件的时候使用缓冲区的
系统文件IO读写文件的时候不使用缓冲区
标准文件IO中标准输入、输出、错误是stdin、stdout、stderr
系统文件IO中标准输入、输出、错误对应的是0、1、2文件描述符(后面有讲解)
open()
#include
#include
#include
int open(const char *pathname,int flags);//pathname是要打开或创建的文件目标,flags是以什么方式打开
int open(const cha *pathname,int flags,mode_t mode);
flags参数:
O_RNONLY //只读
O_WRONLY //只写
O_RDWR//读写
O_CREAT 若文件不存在,则创建它,需要mode来设置权限(这样设置 mode &…umask)
O_APPEND 追加写
write
#include
ssize_t write(int fd,const void *buf,size_t count);//fd文件描述符,buf要输入的数据,count要写入的字节数
成功返回实际写入的字节数,失败返回-1
read
#include
ssize_t read(int fd,void *buf,size_t count);
close
#include
ssize_t close(int fd);//关闭后就不再指向任何文件了,可以在新的文件操作中被使用
lseek 跳转到fd文件的读写位置指定处
#include
#include
off_t lseek(int fd,off_t offset,int whence);//offset偏移量
whence: SEEK_SET(文件夹) SEEK_CUR(当前) SEEK_END(文件尾)
linux下一切皆文件,文件描述符是内核为了高效的管理已经被打开的文件所创建的索引,是从0开始的小整数,指被打开的文件,所有执行I/O操作的系统调用都是通过文件描述符完成的
需要知道下面三点:
1.进程执行open系统调用来打开文件,所以进程必须和文件关联,每个进程都有一个指针*files,指向一张表file_struct,该表中包含一个指针数组,每个元素都是一个指向打开文件的指针。所以本质上,文件描述符就是该数组的下标,只要拿着文件描述符,就可以找到对应的文件。
2.当我们打开文件时,操作系统要在内存中创建相应的数据结构来描述该文件,所以产生了file结构体,表示一个已经打开的文件对象。
3.在程序刚启动时,Linux进程下默认有三个文件描述符,是 0、1、2,分别代表标准输入、标准输出、标准错误,对应的物理设备一般是:键盘、显示器、显示器,当我们再打开一个新文件时,它的文件描述符就为3,依次。
文件描述符分配规则
先来看个代码:
#include
#include
#include
#include
int main()
{
close(1);
int fd=open("./test.txt",O_RDONLY);
if(fd<0)
{
perror("open error");
return 1;
}
printf("fd: %d\n",fd);//1
return 0;
}
分配规则:使用当前没有被使用的最小的下标
1被关闭,这是最小且没有被使用的描述符为1,所以打开文件.txt文件时被分配到1中,1作为.txt的新的文件描述符
假如有个数据,原本要把它输出到屏幕上,现在重新定向到某个指定的文件中。这就叫重定向,所以当我们不想直接在显示器上看见输出,就可以把它重定向到某个文件中
输出重定向(覆盖): >
输出重定向(追加):>>