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 arr10,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;
    
}
相关推荐
AAA@峥40 分钟前
容器数据不丢失:Docker 分层存储 + Volume 共享、备份迁移完整指南
运维·docker·容器
MDM.Plus1 小时前
苹果MDM技术演进:从远程控制到设备信任体系的构建
运维·服务器·安全·ios·mdm·手机店
REDcker1 小时前
macOS 挂载 Linux 远程目录详解
linux·运维·macos
2601_961593421 小时前
Mac 上搭建Linux环境吗?VMware + CentOS Stream 9 镜像快速部署
linux·运维·ide·macos·centos
dddwjzx1 小时前
嵌入式Linux C应用编程入门——线程 (二)
linux·嵌入式
写代码的学渣1 小时前
Linux systemd 开机启动日志逐行详细解析报告
linux·运维·服务器
田里的水稻2 小时前
EP_XML\JSON配置文件和YAML
xml·运维·人工智能·机器人·自动驾驶·json
阿成学长_Cain2 小时前
Linux telinit 命令详解:运行级别切换|关机重启|系统维护一站式掌握
linux·运维·前端·网络
QXWZ_IA3 小时前
油气储罐沉降监测用什么技术方案最好?千寻自动化监测+次声波泄漏方案
运维·科技·自动化·能源
NiceCloud喜云3 小时前
Anthropic 一周三连发:Cowork 多端、Fable 5 按需付费、J-space 论文的技术解读
java·服务器·网络·人工智能·ai