【Linux】基础IO-IO接口,文件描述符,重定向

【Linux】基础IO

一、C语言中文件IO操作

1.C语言中的开关读写文件

在学习Linux中的IO操作之前,我们先来简单的回顾一下,C语言中我们常用的一些IO操作的接口。

1.1.fopen()

FILE* fopen(const char* path, const char* mode);
  • 函数参数
    • path:要打开的文件
    • mode:打开文件的方式
      • r:可读方式
      • r+:可读可写方式
      • w:可写方式,如果文件不存在,就创建一个文件。如果文件已经存在,就截断一个文件(清空文件内容)
      • w+:可读可写方式,如果文件不存在,就创建一个文件。如果文件已经存在,就截断一个文件(清空文件内容)
      • a:追加写,但是不可以读取内容。如果文件不存在,就创建一个文件。如果文件已经存在,就在文件的末尾开始追加写
      • a+:追加写,可以读取内容。如果文件不存在,就创建一个文件。如果文件已经存在,就在文件的末尾开始追加写
  • 函数返回值
    • 成功:返回一个文件流指针FILE
    • 失败:返回NULL

作用:以某种方式打开一个文件,并返回一个指向该文件的文件流指针。

1.2.fclose()

int fclose(FILE* fp);

作用:关闭传入的文件流指针指向的文件。

1.3.fwrite()

size_t fwrite(void* ptr, size_t size, size_t nmemb, FILE* stream);
  • 函数参数
    • ptr:写入文件的内容
    • size:往文件中写入的块的大小,单位为字节
    • nmemb:预期写入的块数
    • stream:预期写入文件的文件指针
  • 函数返回值
    • 成功:写入文件中的块数
  • 常见用法
    • 定义块的大小为1个字节,nmemb为向写入的字节数量,返回值为成功写入的字节数
#include <cstdio>
#include <cstring>
#include <cstdlib>

int main()
{
   
    FILE* fp = fopen("myfile.txt", "w");
    if (!fp) {
   
        perror("fopen");
        exit(-1);
    }

    const char* msg = "hello Linux file\n";
    fwrite(msg, sizeof(char), strlen(msg), fp);

    fclose(fp);
    return 0;
}

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-99d4hoFd-1635688996857)(D:\github\gitee\linux-study\【Linux】基础IO.assets\1634819512265.png)]

注意:fopen()中的path不是执行程序的所处的路径,而是进程运行时做出的路径。

举例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q6E4HfTk-1635688996859)(D:\github\gitee\linux-study\【Linux】基础IO.assets\1634819722525.png)]

1.4.fread()

size_t fread(void* ptr, size_t size, size_t nmemb, 	FILE* stream);
  • 函数参数
    • ptr:将从文件读取的内容保存在ptr所指向的空间中
    • size:定义读文件时块的大小,单位为字节
    • nmemb:期望从文件中读的块数
    • stream:预期读取文件的文件指针
  • 函数返回值
    • 成功从文件中读取的块的个数
  • 常见用法
    • 定义块的大小为1个字节,nmemb为向写入的字节数量,返回值为成功读取的字节数
#include <cstdio>
#include <cstring>
#include <cstdlib>

int main()
{
   
    FILE* fp = fopen("myfile.txt", "r");
    if (!fp) {
   
        perror("fopen");
        exit(-1);
    }

    char buff[64];
    fread(buff, sizeof(char), sizeof(buff) / sizeof(char), fp);
    printf("%s", buff);

    fclose(fp);
    return 0;
}

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-odv2rEx0-1635688996860)(D:\github\gitee\linux-study\【Linux】基础IO.assets\1634820342320.png)]

2.stdin&&stdout&&stderr

默认情况下,C语言会自动打开两个输入输出流,分别是stdinstdoutstderr

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vYs7a1Js-1635688996862)(D:\github\gitee\linux-study\【Linux】基础IO.assets\1634820757387.png)]

这三个流的类型都是FILE,也就是文件指针类型。

既然是文件指针,所以这三个指针分别指向键盘,显示器,显示器。后面的系统IO会再详细的讲解这三个输入输出流。

3.三个标准流和IO接口

可以利用上面这三个标准流和C语言的IO接口,将字符串直接打印到显示器上。

#include <cstdio>
#include <cstring>
#include <cstdlib>

int main()
{
   
    FILE* fp = fopen("myfile.txt", "w+");
    if (!fp) {
   
        perror("fopen");
        exit(-1);
    }

    char buff[64];
    fread(buff, sizeof(char), 12, stdin);// 从键盘中输入到buff中

    fwrite(buff, sizeof(char), strlen(buff), stdout); // 从buff中写入到显示器上

    fclose(fp);
    return 0;
}

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6a9BnDnx-1635688996864)(D:\github\gitee\linux-study\【Linux】基础IO.assets\1634821318807.png)]

二、系统文件IO

其实除了C语言之外,很多语言都是自己的IO接口函数,但是下面我们要谈论的就是系统给我们提供的IO接口,也就是系统级别的IO接口。

1.系统级别的开关读写文件

1.1.open()

// 在打开的文件已经存在的时候
int open(const char* pathname, int flags);
// 在打开的文件不存在的时候
int open(const char* pathname, int flags, mode_t mode);
  • 函数参数
    • pathname:需要打开的文件
    • flags:打开文件的方式
      • 必选项
        • O_RDONLY:只读方式
        • O_WRONLY:只写方式
        • O_RDWR:读写方式
      • 可选项
        • O_TRUNC:截断文件(清空文件内容)
        • O_CREAT:文件不存在则创建文件
        • O_APPEND:追加方式
        • O_EXXL | O_CREAT:如果文件存在,则打开文件失败
      • 原理
        • 可以使用按位或的方式进行组合:如打开并创建只写文件O_WRONLY | O_CREAT
        • 本质是利用了位图的方式来表示每一种的方式
    • mode:当打开一个新开的文件的时候,需要给一个文件设置权限,需要设置一个8进制的数字。这个和umask也会有关系
  • 函数返回值
    • 成功:返回一个文件描述符(后面介绍)
    • 失败:返回-1

作用:打开一个文件

1.2.close()

int close(int fd);

  • 函数参数
    • fd:文件描述符

作用:关闭一个文件

1.3.write()

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

  • 函数参数
    • fd:文件描述符
    • buf:将buf中的内容写到文件中
    • count&
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hyzhang_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值