1.Linux应用开发 ---- 文件基本操作(open、write、read、close、lseek)

本文内容主要为Linux文件的基本操作:

打开文件:int open(const char *pathname, int flags);

文件写入:ssize_t write(int fd, const void *buf, size_t count);

文件读取:ssize_t read(int fd, void *buf, size_t count);

关闭文件:int close(int fd);

读写位置偏移量:off_t lseek(int fd, off_t offset, int whence);

open:

返回值:文件描述符

pathname:目标文件夹路径

flags:文件打开方式(只读、只写、可读可写...)

write/read:

返回值:读/写字节数

fd:文件描述符

buf:需要写如的字节内容/读取的内容

count:读/写字节大小

lseek:

fd:文件描述符。

offset:偏移量,以字节为单位。

whence:用于定义参数 offset 偏移量对应的参考值

返回值:位置偏移量

函数其余内容不再过多叙述,可通过命令man 2 函数名进行查看,例如:man 2 open

文件读写例程:

//open、write、read头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

//close的头文件
#include <unistd.h>

int main(void)
{
    char buff[1024] = {0};
    int fd1,fd2;
    int ret;
    /****************************************************************************
     * O_RDONLY      只读方式打开文件
     * O_WRONLY      只写方式打开文件
     * O_CREAT       如果文件不存在则创建文件
     * O_DIRECTORY   如果指向不是目录,则OPEN失败
     * O_EXCL        与O_CREAT一起使用,原子操作
     * O_TRUNC       调用 open打开文件时会自动清空文件内容
     * O_APPEND      对文件进行写操作时,自动把文件当前位置偏移量移动到文件末尾
     * ************************************************************************/
    //1.打开源文件,以只读的方式
    fd1 = open("./ProFile",O_RDONLY);
    if(fd1 == -1)
    {
        close(fd1);
        return fd1;
    }

    //2.打开目标源文件,以只写的方式
    fd2 = open("./testfile",O_WRONLY);
    if(fd2 == -1)
    {
        close(fd1);
        close(fd2);
        return fd2;
    }
        
    //3.读取源文件数据
    ret = read(fd1, buff, sizeof(buff));
    if(ret == -1)
    {
        close(fd1); 
        close(fd2);

        return ret;
    }

    //4.将读取源文件数据写入目标源文件
    ret = write(fd2, buff, sizeof(buff));
    if(ret == -1)
    {
        close(fd1);
        close(fd2);
        return ret;
}
//5.关闭文件
    close(fd1);
    close(fd2);
    return 0;
}

说明:首先创建main.c函数,在当前目录再手动创建任意两个文本testfile和ProFile:

testfile为空文件,ProFile文件随便写入一些内容:

  1. 以只读的方式打开文件ProFile,打开失败则关闭文件,函数运行结束
  2. 以只写的方式打开文件testfile,打开失败则关闭文件,函数运行结束
  3. 从ProFile文件头开始,读取1024个字节数据存入buff中,读取失败,关闭文件,退出执行。
  4. 将buff中的数据写入文件testfile中,写入失败则关闭文件,退出函数。
  5. 文件操作完成,关闭文件

函数内容中,对open函数比较常用的指令进行了说明,需要熟练掌握。

输入 gcc -o main main.c对main.c函数进行编译,输入 ./main 运行,使用cat testfile可以看到文件ProFile的1024字节内容被写入testfile中,执行结果如下图:

lseek函数

lseek比较重要的标志已在函数中备注。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main(void)
{
    char buff[512] = {0};
    int fd1,fd2;
    int ret;

    //1.打开源文件,以只读的方式
    fd1 = open("./ProFile",O_RDONLY);
    if(fd1 == -1)
    {
        close(fd1);
        return fd1;
    }

    //2.打开目标源文件,以只写的方式
    fd2 = open("./testfile",O_WRONLY);
    if(fd2 == -1)
    {
        close(fd2);
        return fd2;
    }

    //3.指针偏移:从文件头开始计算1024位置
    lseek(fd1, 1024, SEEK_SET);

    //4.读取源文件数据
    ret = read(fd1, buff, sizeof(buff));
    if(ret == -1)
    {
        close(fd1);
        close(fd2);
        return ret;
    }

    /************************************************************

     * SEEK_SET  读写偏移量将指向offset字节位置处(从文件头开始计算)

     * SEEK_CUR  读写偏移量指向当前位置偏移量+offset字节位置处。

     * SEEK_END  读写偏移量将指向文件末尾+offset字节位置处

     * //offset可为正也可为负

     ***********************************************************/

    //5.指针偏移:指向文件末尾
    lseek(fd2, 0, SEEK_END);

    //6.将读取源文件数据写入目标源文件
    ret = write(fd2, buff, sizeof(buff));
    if(ret == -1)
    {
        close(fd1);
        close(fd2);
        return ret;
    }

    close(fd1);
    close(fd2);
    printf("system run ok...\n");

    return 0;
}

程序执行说明:

3.位置偏移至文件ProFile的第1024个字节处

4.从文件ProFile的第1024个字节处读取512个字节存入buff中

5.位置偏移至文件testfile的第1024个字节处

6.从文件testfile的第1024个字节处开始写入buff数据

可能出现的bug说明:

文件无法读写,如果文件是从windows系统传入Linux中的文件,那么该文件可能没有读写权限,可以通过chmod 777 文件名 给文件赋予权限,权限赋予失败则sudo chmod 777 文件名

gcc -o main main.c 无法执行,需要安装gcc编译器,sudo apt install gcc

如有不清楚以及文章内容错误的地方,欢迎留言指正,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值