Linux:基础IO介绍-1

IO介绍

IO就是input/output意思是输入输出,计算机的输入输出,例如键盘就是一个输入设备,我们按下一个按键,键盘会将其转换成电信号通过与计算机链接的线路传到主机的对应接口处,接口处即主板上会有对应的硬件负责信号的转化,数据的存储然后通过总线(控制总线/数据总线)将其传递给cpu,cpu根据当前运行的程序对数据进行计算或者通过主板线路传递给屏幕,由屏幕进行打印输出,屏幕就是一个输出设备。

在计算机中一切都是数据,数据会在键盘,屏幕,音响,cpu,硬盘,内存中相互传递拷贝,这些都是数据的输入输出。

系统中,打开了计算机,就会有很多的进程开启,如操作系统,微信,QQ等,程序之间也会有数据的传递,进程间也需要有数据输入输出的方式。

在Linux系统中一切皆文件,linux系统中的IO大部分都是以文件形式进行的。

C文件IO

使用C语言进行文件操作时需要包含头文件<stdio.h>里面包含的C语言格式的文件操作方法和函数

FILE *fopen(const char *pathname, const char *mode);//适用于二进制文件和文本文件

pathname:文件路径,可以是绝对路径也可以是相对路径(程序所在路径)

mode:打开方式 "r"-只读打开 "w"-只写打开,先清空在打开文件 "a"-追加,打开后指针指向文件结尾,添加数据会直接在最后面。"r+"-读写打开 "w+"-读写打开,先清空 "a+"-读写追加。

若没有已存在文件会自动创建文件。

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);将指定文件的内容读取缓冲区中,与fwrite搭配使用。

ptr:指向自定义缓冲区得指针

size:每个元素的大小,如sizeof(int),sizeof(char)

nmemb:元素的个数,即读取文件内容的总大小为size*nmemb。

stream:文件指针,即fopen的返回值。

返回值是实际读到的元素个数,返回值小于nmemb代表读到结尾或者出错

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);//将缓冲区内数据写入到指定文件中

ptr:缓冲区指针。

size:元素大小

nmemb:元素个数 ,如需要将数据内数据写入文件中数据为int arr[10],size=sizeof(int),nmemb=10.

stream:文件指针,fopen的返回值。

fclose(FILE *stream):关闭打开的文件描述符,若是进程打开大量文件描述符不关闭也不使用会导致文件描述泄露。

返回值是实际写入的元素个数,返回值小于nmemb代表磁盘已满或写错误

复制代码
#include <stdio.h>

int main()
{
    FILE* fpw=fopen("./file.txt","w");
    const char* writebuff="hello world";
    ssize_t n=fwrite(writebuff,sizeof(char),strlen(writebuff),fpw);
    close(fpw);

    FILE* fpr=fopen("./file.txt","r");
    char buff[1024];
    ssize_t n=fread(buff,sizeof(char),sizeof(buff),fpr);
    close(fpr);
    return 0;
}

系统文件I/O

除了C语言有提供文件操作的方式,其他如C++都有提供其独特的文件操作方式,而且底层实际上都是使用的系统文件IO的接口linux上就是open函数是posix 系统调用。

头文件为

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

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

int open(const char *pathname, int flags, mode_t mode);

pathname:文件路径,与fopen一样可以是相对路径也可以是绝对路径

flags:打开标志位

O_RDONLY:只读

O_WRONLY:只写

O_RDWR:读写

可选标志位(按位 | 进行组合)

O_CREAT:文件不存在则创建

O_TRUNC:打开时清空文件

O_APPEND:追加模式

O_NONBLOCK:非阻塞模式

mode:文件权限仅创建时需要使用八进制表示,与系统umask掩码共同决定文件的权限:0666

返回值是一个整数,文件描述符,C语言中的FILE是一个结构体对此文件描述符的封装。

#include <unistd.h>

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

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

fd:文件描述符,open的返回值

buf:缓冲区指针

count:读写的大小,单位是字节

复制代码
#include <stdio.h>
#include <unistd.h>
#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    int fd=open("./text.txt",O_WRONLY | O_APPEND | O_CREAT,0644);
    if(fd<0)perror("open fail");
    const char* writebuf="hello world\n";
    int count=5;
    while(count--)
    {
        ssize_t n=write(fd,writebuf,strlen(writebuf));
    }
    ::close(fd);

    fd=open("./text.txt",O_RDONLY);
    if(fd<0)perror("open fail");
    char buff[1024];
    ssize_t n=read(fd,buff,sizeof(buff));
    printf("buff: %s",buff);
    return 0;
    
}
相关推荐
chlk12315 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑15 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件16 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
碳基沙盒16 小时前
OpenClaw 多 Agent 配置实战指南
运维
深紫色的三北六号1 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash1 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行2 天前
Linux和window共享文件夹
linux
Sinclair2 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
木心月转码ing3 天前
WSL+Cpp开发环境配置
linux