目录
前言:io是啥?为什么要去学习它?
IO是输入input输出output的首字母缩写形式,直观意思是计算机输入输出,它描述的是计算机的数据流动的过程,因此IO第一大特征是有数据的流动;另外,对于一次IO,它究竟是输入还是输出,是针对不同的主体而言的,不同的主体有不同的描述。例如,甲乙两人交谈,甲将大脑中的想法通过声带震动,继而通过声波传入乙的耳朵,乙通过耳膜的震动再由神经将信号解析到大脑,这个数据流动的过程对甲而言是输出,对乙而言是输入。
因此,理解IO一定要弄清楚所要研究的本体。
学习的目的就是为了将数据存储以及对于文件的操作。
IO的分类
1、标准IO(高级磁盘IO)
2、文件IO(低级磁盘IO)
标准IO与文件IO的区别
文件I/O 又称为低级磁盘I/O,遵循POSIX相关标准。任何兼容POSIX标准的操作系统上都支持文件I/O。标准I/O被称为高级磁盘I/O,遵循ANSI C相关标准。只要开发环境中有标准I/O库,标准I/O就可以使用。(Linux 中使用的是GLIBC,它是标准C库的超集。不仅包含ANSI C中定义的函数,还包括POSIX标准中定义的函数。因此,Linux 下既可以使用标准I/O,也可以使用文件I/O)。
通过文件I/O读写文件时,每次操作都会执行相关系统调用。这样处理的好处是直接读写实际文件,坏处是频繁的系统调用会增加系统开销,标准I/O可以看成是在文件I/O的基础上封装了缓冲机制。先读写缓冲区,必要时再访问实际文件,从而减少了系统调用的次数。
文件I/O中用文件描述符表现一个打开的文件,可以访问不同类型的文件如普通文件、设备文件和管道文件等。而标准I/O中用FILE(流)表示一个打开的文件,通常只用来访问普通文件。
系统调用和缓冲机制
注意:
库函数和系统调用函数的关系:大对数库函数都是由系统调用函数封装起来的
标准IO
标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性。标准I/O库处理很多细节。例如缓存分配,以优化长度执行I/O等。标准的I/O提供了三种类型的缓存。
(1)全缓存:当填满标准I/O缓存后才进行实际的I/O操作。
(2)行缓存:当输入或输出中遇到新行符时,标准I/O库执行I/O操作。
(3)不带缓存:stderr就是了。
1、流
文件被打开时,创建的结构体名为FILE的结构体指针,形象的称为“流”。
存在三个特点:
- 有源头:APP
- 有目的:缓冲区
- 持续性:不断放入数据到缓冲区
一旦具备以上3个特点,就会形成流,所以通过文件指针操作文件可以理解为是通过操作流来操作文件。
2、流的分类
第一类:stdin(标准输入--》键盘)。
第二类: stdout(标准输出-》终端)。
第三类:stderr(标准出错--》会向终端打印,不带缓冲区(意味着每一次出错就会立即刷新缓冲区))。
3、缓冲机制
全缓冲
缓冲区被放满,程序结束,强制刷新--》会引起缓冲区的刷新
行缓冲
缓冲区被放满,程序结束,强制刷新,遇到换行符--》会引起缓冲区的刷新
不带缓冲
不存在缓冲区的概念---《每一次读写都是直接输出:stderr》
4、文件操作
有三种,但是不管哪一种都会1、打开文件,2、读写文件,3、关闭文件这三种。
1、按照字符操作
函数名:fgetc() fputc()
头文件:#include <stdio.h>
函数原型:int fgetc(FILE *stream);
功能:从指定的文件流中获取一个字符
参数:指定获取一个字符所处文件的文件流
返回值:1、 成功返回获取到的字符值2、 读取到文件末尾返回EOF(-1)3、操作中失败返回负数。
int fputc(int c, FILE*stream);
功能:向指定的文件流中输出一个字符
参数1:需要输出的指定字符(字符被称为单字节的整形)
参数2:指定输出字符到的文件对应的文件流
返回值:成功返回刚写入的字符值,失败返回EOF(-1)
案例:实现对于指定一个文件读取,读取方式为按照字符操作,将读取完毕之后的结果显示在终端上。(自己实现命令cat 文件名)
思路:
- 打开需要显示文件内容所在的文件
- 获取一个字符
- 输出一个字符
- 重复2.3直至文件末尾截止
- 关闭文件
2、按照行操作
标志:寻找’\n’
函数: fgets fputs
函数原型:char * fgets(char *s, int size, FILE *stream);
参数1: 即将存储内存空间首地址
参数2: 存储内容空间的大小(可以sizeof()测得)
参数3: 指定的文件流
返回值:成功返回存储内容空间首地址,失败返回NULL
思考:fgets什么时候会返回?
情况1:第一次遇到’\n’就会返回
情况2:该行会比较长,需要多次读取才能读完,所以位于读到’\n’之前的多次都是读取到size-1就返回。
3、按照块操作
函数:fread() fwrite()
函数原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数1:存储读取一块内容之后的空间地址
参数2:块的大小---》建议给1
参数3:块的个数---》建议给sizeof()
参数4:要读取的文件对应的文件流
返回值:成功代表读取的块的个数,失败返回0
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
参数1:需要写入的内容的空间地址
参数2:块的大小---》建议给1
参数3:块的个数---》建议给sizeof()
参数4:要写入的文件对应的文件流
返回值:成功代表写入的块的个数,失败返回0
文件IO
文件I/O称之为不带缓存的IO(unbuffered I/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os绑定,特定于linix或unix平台。
文件IO主要就四个:open close read write
头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
1、打开文件
函数原型:int open(const char *pathname, int flags);
功能:打开指定的文件
参数1:所需打开文件的名字(包含路径)
参数2:打开文件的方式---》主标志 | 副标志
返回值:成功代表一个大于0 的数字(文件描述符),失败返回-1(errno ie set...)int open(const char *pathname, int flags, mode_t mode);
功能:打开指定的文件
参数1:所需打开文件的名字(包含路径)
参数2:打开文件的方式---》主标志 | 副标志
参数3:当需要O_CREAT时,就要写该参数来为创建的新文件指明权限(八进制表示)
返回值:成功代表一个大于0 的数字(文件描述符),失败返回-1(errno ie set...)
2、关闭文件
功能:关闭一个文件描述符
参数:打开文件成功之后的文件描述符
3、写文件
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
功能:向指定的文件描述符的文件内写入内容
参数1:打开文件之后的文件描述符
参数2:所需写入的内容所在空间首地址
参数3:需要写入的字节数
返回值:成功返回写入的字节数,返回0代表没有写入任何内容,返回-1代表出错(errno is set...)
4、读文件
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:从指定的文件描述符的文件中读取内容
参数1:打开文件之后的文件描述符
参数2:存储读取到结果的空间首地址
参数3:可以读取的字节数---》sizeof测得
返回值:成功返回读取的字节数,返回0代表读取完毕,返回-1代表出错(errno is set...)
操作目录
操作目录流程流程:
opendir readdir closedir
1、打开目录
2、操作目录
3、关闭目录
4、测试文件属性
了解静态库与动态库的创建
1、创建静态库
2、创建动态库
今天的文章 IO的详细介绍分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/86322.html