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;
    
}
相关推荐
A小辣椒5 小时前
TShark:基础知识
linux
AlfredZhao7 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao21 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux