打开与关闭
1、打开文件
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
返回值:成功返回文件描述符,失败返回EOF
pathname:文件路径
flags:标志,其中O_RDONLY、O_WRONLY、O_RDWR三个互斥,其余可用 ' | ' 链接
标志名 | 含义 |
O_RDONLY | 只读方式打开 |
O_WRONLY | 只写方式打开 |
O_RDWR | 可读可写方式打开 |
O_CREAT | 文件不存在则创建,此时mode参数有效 |
O_EXCL | 与O_CREAT搭配使用,测试文件是否存在,存在返回错误 |
O_TRUNC | 若文件存在,则清除文件原有的内容 |
O_APPEND | 以尾部插入的方式进行写入 |
mode:表示文件的权限,是可读可写可执行,以八进制表示。实际权限 = mode & (~umask)
具体权限参考博文"4.Linux_Shell命令"中的"3、修改文件权限“章节,博文链接如下:
4.Linux_Shell命令-CSDN博客
注意:open函数只能打开设备文件,不能创建设备文件
2、关闭文件
int close(int fd);
返回值:成功返回0,失败返回EOF
fd:要关闭的文件描述符
注意:文件关闭后,fd不再能代表文件
读写与光标
读写文件的使用方式与标准I/O中的fread、fwrite非常相似。
1、读取文件
ssize_t read(int fd, void *buf, size_t count);
返回值:成功返回实际读取的大小,失败返回EOF,读取到末尾返回0
fd:要进行操作的文件的文件描述符
buf:读取数据缓冲区,用于存放读取的数据
count:想要读取数据的个数,单位:字节
注意:返回值不一定等于count,假如文件只有3个字节,count传入5,那么返回值是3
注意:count值不能超过buf的大小
注意:read不会因为遇到回车就停止读取,只有读完count个字节后才会停止
2、写入文件
ssize_t write(int fd, const void *buf, size_t count);
返回值:成功返回实际写入的大小,失败返回EOF
fd:要进行操作的文件的文件描述符
buf:写入数据缓冲区,用于存放要写入的数据
count:想要写入的数据个数,单位:字节
3、定位文件
off_t lseek(int fd, off_t offset, int whence);
返回值:成功返回当前文件读写位置,失败返回EOF
offset、whence含义与fseek完全一致,参考博文"9.2 Linux_标准I/O_相关函数"的"2、流定位"章节,博文链接为:9.2 Linux_标准I/O_相关函数-CSDN博客
整体实验
具体代码实现如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
int main(){int fd;char read_buf[100] = {0};//1.打开文件if((fd = open("./file",O_RDWR|O_CREAT|O_TRUNC,0777)) == -1){perror("open");return -1;}//2.写入数据if(write(fd,"write\n",strlen("write\n")) == -1){perror("write");return -1;}//3.重置光标lseek(fd,0,SEEK_SET);//4.读取数据read(fd,read_buf,sizeof(read_buf));printf("read:%s",read_buf);//5.关闭文件close(fd);return 0;
}
代码运行结果如下: