系统编程(二)文件IO之常用API open write lseek read close

接下来几节我们将重点介绍系统编程文件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”

猜你喜欢

转载自blog.csdn.net/bin_zhang1/article/details/81048847