C语言中的文件接口
1 打开文件
FILE * fopen(const char * path,const char * mode)
参数:path:文件路径 mode:打开文件的方式
返回值:成功返回一个文件流指针,失败返回NULL
举例:打开当前目录下的myfile文件,以只读方式打开
FILE* fd = fopen("myfile", "r");
mode的方式:可以得到:
通过man fopenke
2 关闭文件,释放文件流指针
int fclose(FILE* fp);
参数:fp:需要关闭的文件流指针
返回值:成功返回0,失败返回EOF
举例:关闭之前的fd文件流指针
fclose(fd)
3 读文件
size_t fread(void* readBuff,size_t size, size_t count, FILE* fp);
参数:readBuff:用于接收数据的内存地址 size:一次读几个字节 count:读几次 fp:已经打开的文件流指针
返回值:成功返回读取的字节个数(一般情况下=count*size,有时也会发生读到的个数<count*size的情况),不成功读到文件的末尾,返回0
举例:将之前的fd中的内容读到buff中:size_t readsize = fread(buff, 1, 1024, fd);
4 写文件
size_t fwrite(const void* buff, size_t size, size_t count, FILE* ostream);
参数:buff:一个存放数据的地址,该地址中的内容将要被写入ostream文件流指针所打开的文件里 size:一次要写的字节数 count:需要写几次
返回值:成功返回写的字节数
5 查看文件指针是否到达文件末尾
int feof(FILE* fp);
参数:fp:文件流指针
返回值:到达结尾返回非零值,未到达返回0
6 设置文件流指针的位置
int fseek(FILE* stream, long offset, int whence);
参数:stream:文件流指针 offset:相对于whence的偏移值 whence:通常设置为三个值(SEEK_CUR(当前位置)、SEEK_END(文件末尾)、SEEK_SET(文件开始))
返回值:成功返回0,失败返回非零
7 文件流指针相对于文件开始的偏移字节数
long ftell(FILE* fp);
返回值:成功返回偏移的字节 数失败返回-1
系统文件I/O
1 打开文件
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
参数:pathname:文件路径 mode:打开方式(如下第二张图) flags:函数选项(可以是用 ' | ' 传递多个选项实现不同功能)
常用的打开文件选项:
O_RDONLY(只读方式打开) O_WRONLY(只写方式打开) O_RDWR(读写方式打开)
2 关闭文件
int close(int fd);
参数:传入文件描述符即可,切记操作完成之后关闭文件描述符,防止内存泄漏
3 读文件
ssize_t read(int fd, void* buff, size_t count);
参数:fd:文件描述符 buff:将读到的内容存到buff中 count表示要读几个字节
4 写文件
ssize_t write(int fd, void* buf, size_t count)
参数:fd:文件描述符 buf:将buf中的数据写到文件中 count:要写的文件的字节数
注意:系统函数和系统调用的关系一目了然,可以认为f系列函数是对系统调用的封装,方便二次开发
文件描述符
1 linux进程在默认情况下会打开三个文件描述符,分别是0,1,2;它们分别代表标准输入,标准输出,标准错误
2 当我们打开文件时,操作系统要在内存中创建相应的数据结构来描述目标文件,于是就有了files_struct结构体,表示一个已经打开的文件对象。而进程在执行open系统调用,
所以会放让进程和文件关联起来,每个进程pcb都有一个*files指针,指向files_struct结构体中的一个数组,该数组的下标就是文件描述符,每一个元素都是指向打开文件的指针。
3 文件描述符的分派规则
在files_struct中,找到当前没有被使用的最小的小标作为新打开文件的文件描述符;例如,当手动关闭标准错误文件描述符时,当再新建一个文件的时候,新文件的文件描述符就为3;