IO的详细介绍
目录
IO的分类
1、标准IO(高级磁盘IO)
2、文件IO(低级磁盘IO)
标准IO与文件IO的区别
系统调用和缓冲机制
标准IO
1、流
2、流的分类
3、缓冲机制
全缓冲
行缓冲
不带缓冲
4、文件操作
1、按照字符操作
2、按照行操作
3、按照块操作
文件IO
1、打开文件
2、关闭文件
3、写文件
4、读文件
操作目录
操作目录流程流程:
opendir readdir closedir
1、打开目录
2、操作目录
3、关闭目录
4、测试文件属性
了解静态库与动态库的创建
1、创建静态库
2、创建动态库
前言: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、关闭文件
#include <unistd.h>
int close(int fd);
功能:关闭一个文件描述符
参数:打开文件成功之后的文件描述符
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、创建动态库
CSDN-Ada助手: 非常感谢您分享这篇关于Linux系统和C高级知识的博客!您的文章对于想要深入了解Linux和C语言的读者来说一定非常有用。除了您提到的知识点外,还有一些扩展知识和技能,如网络编程、多线程编程、数据结构与算法等都是和Linux和C语言相关的重要内容,希望您也可以分享您在这些领域的学习和实践经验,让更多的读者受益。同时也希望您能够继续更新博客,分享更多的经验和知识,让我们共同进步。 如何写出更高质量的博客,请看该博主的分享:https://blog.csdn.net/lmy_520/article/details/128686434?utm_source=csdn_ai_ada_blog_reply2 如果您持续创作,完成第三篇博客,并且质量分达到 80 分以上,在评论区就有机会获得红包奖励哦!
CSDN-Ada助手: 非常感谢您对数据结构的介绍,这篇博客让我对数据结构有了更深入的了解。恭喜您写了第四篇博客,您的持续创作精神值得表扬。接下来,我建议您可以在此基础上进一步深入探讨数据结构的实际应用和优化策略,期待您的更多优秀文章。 CSDN 会根据你创作的前四篇博客的质量,给予优秀的博主博客红包奖励。请关注 https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply4 看奖励名单。
CSDN-Ada助手: 恭喜您写了又一篇博客!看到标题是“IO的详细介绍”,我很期待能够了解更多关于IO的知识。同时,我也想建议您在未来的创作中可以多探索一些新的主题或视角,这样能够更加丰富您的博客内容,吸引更多读者。再次祝贺您,期待您的下一篇博客! CSDN 正在通过评论红包奖励优秀博客,请看红包流:https://bbs.csdn.net/?type=4&header=0&utm_source=csdn_ai_ada_blog_reply3,我们会奖励持续创作和学习的博主,请看:https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply3
CSDN-Ada助手: 推荐 C 技能树:https://edu.csdn.net/skill/c?utm_source=AI_act_c