接下来几节我们将重点介绍系统编程文件IO方面比较常用的API,并辅以相关代码,由浅入深,层层递进,这一节我们介绍文件操作中最基本的open(),write(),close(),lseek()四个函数
首先我们来先一下。
这里我们先来看看这些函数的原型
有时候我们不记得相关函数的原型了,在linux命令行中查询,例如要查看open函数,可以用
man 2 open
相关知识在上一节中有介绍,详细内容请参阅上一篇文章。
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname:打开文件的路径名
flags:用来控制打开文件的模式
mode:用来设置创建文件的权限(rwx)。当flags中带有O_CREAT时才有效。
返回值: 调用成功时返回一个文件描述符fd,调用失败时返回-1,并修改errno
ssize_t read(int fd, void *buf, size_t count);
fd:指定要读取的文件句柄
buf:用来存储读取的内容,一般我们会在应用程序中提前设置好读取的缓冲区
count:读取文件内容的长度,单位是字节
返回值:ssize_t类型是linux内核用typedef重定义的一个类型(其实就是int),返回值表示成功读取的字节数
count是我们想读取的字节数,而read返回值为我们实际读取的字节数
off_t lseek( int filedes, off_t offset, int whence );
filedes:指定文件句柄
whence:
取SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节
取SEEK_CUR,则将该文件的偏移量设置为其当前位置加offset,offset可为正或负
取SEEK_END,则将新文件的偏移量设置为文件长度加上offset,offset可为正或负
返回值:若成功则返回新的文件偏移量,若出错则返回-1
int close(int fd);
fd:指定要关闭的文件句柄
返回值:成功返回0,出错返回-1并设置errno
下面是对这几个函数的简单应用
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int fd;
char wbuf[] = "Hello World";
char rbuf[10];
if((fd = open("demo2.txt", O_RDWR | O_CREAT)) < 0)//打开文件
{
printf("open file failed\n");
}
if(write(fd, wbuf, sizeof(wbuf)) != sizeof(wbuf))//在文件中写入hello World
{
printf("write wbuf error\n");
}
if(lseek(fd, 6, SEEK_SET) == -1) //将读写指针移到距离开始6个字节的地方
{
printf("lseek error\n");
}
if(read(fd, rbuf, 5) != 5)//开始读取
{
printf("read error\n");
}
printf("rbuf = %s\n",rbuf);
return 0;
}
最终会输出”World”