LinuxC编程——文件IO

在C语言的标准IO库中的库函数,如fclose、fopen,、fread、fwrite,提供的是高层服务;而Linux的文件I/O调用提供的是底层的服务,底层的服务不提供缓冲而直接进入操作系统。标准I/O库中的高层服务归根到底还是要调用Linux所提供的底层服务。

一、概念⭐⭐

  • 系统中定义的一组用于输入输出的函数接口(注意和标准IO概念上的区别🚨👉标准IO是在C库中定义的一组用于输入输出的函数接口)

二、特点⭐⭐⭐

  • 1)没有缓冲机制,每次调用都会引起系统调用
  • 2)围绕文件描述符进行操作,文件描述符是非负整数(>=0)依次分配
  • 3)默认打开三个文件描述符0(标准输入),1(标准输出),2(标准错误)
  • 4)可以操作任意类型文件,目录文件除外

三、函数⭐⭐⭐⭐

3.1 打开文件 open

  • *int open(const char pathname, int flags);

  • 功能:打开文件

  • 参数:

    • pathname:文件名或包含路径的文件名

    • flags:打开文件的方式

      • O_RDONLY:只读
      • O_WRONLY:只写
      • O_RDWR:可读可写
      • O_CREAT:创建
      • O_TRUNC:清空
      • O_APPEND:追加
  • 返回值

    • 成功:文件描述符
    • 失败:-1
  • 当第二个参数中有O_CREAT选项时,需要给open函数传递第三个参数,指定创建文件的权限

  • *int open(const char pathname, int flags, mode_t mode);
    创建出来的文件权限为指定权限值&(~umask) //umask为文件权限掩码

  • 标准IO文件打开权限与
    文件IO文件打开权限对比

    • pC9TAMR.png

3.2 关闭文件 close

  • int close(int fd);

  • 功能:关闭文件

  • 参数:fd:文件描述符

  • 返回值:

    • 成功:0
    • 失败:-1

3.3 读写操作

  • read

    • *ssize_t read(int fd, void buf, size_t count);

    • 功能:从一个已打开的可读文件中读取数据

    • 参数

      • fd 文件描述符
      • buf 输入缓冲区指针
      • count 要读入的字节数
    • 返回值

      • 成功:实际读到的字节数
      • 返回0:表示读到文件结尾
      • 返回-1:表示出错,并设置errno号
  • write

    • *ssize_t write(int fd, const void buf, size_t count);

    • 功能:向指定文件描述符中,写入 count个字节的数据。

    • 参数

      • fd 文件描述符
      • buf 要写的内容
      • count 要写入的字节数
    • 返回值

      • 成功:实际写入的字节数
      • 失败 : -1
      • 没有数据要写:0
    • pC9TEs1.md.png
  • 练习:实现Linux下的cp命令

/*文件IO实现cp功能*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char const *argv[])
{
    if (argc != 3)
    {
        printf("%s: missing file operand\n", argv[0]);
        return -1;
    }
    int src = open(argv[1], O_RDONLY);//打开源文件
    if (src < 0)
    {
        perror("open src error");
        return -1;
    }
    int dest = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666);//打开目标文件
    if (dest < 0)
    {
        perror("open dest error");
        return -1;
    }
    char buf[32];
    ssize_t s;
    //寻循环读源文件、写目标文件(读多少写多少,保证在最后一次读写目标文件中不会有乱码)
    while ((s = read(src, buf, 32)) != 0)
        write(dest, buf, s);
    //关闭文件
    close(src);
    close(dest);
    return 0;
}

3.4 定位操作 lseek

  • off_t lseek(int fd, off_t offset, int whence);

  • 功能:设定文件的偏移位置

  • 参数

    • fd:文件描述符

    • offset偏移量

      • 正数:向文件结尾位置移动
      • 负数:向文件开始位置
    • whence 相对位置

      • SEEK_SET 开始位置
      • SEEK_CUR 当前位置
      • SEEK_END 结尾位置
  • 返回值

    • 成功:文件的当前位置
    • 失败:-1

四、文件IO与标准IO的对比

pC9TgoT.png

脑图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunqk5665

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值