IO的详细介绍

目录

前言: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的结构体指针,形象的称为“流”。

存在三个特点:

  1. 有源头:APP
  2. 有目的:缓冲区
  3. 持续性:不断放入数据到缓冲区

一旦具备以上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 文件名)

思路:

  1. 打开需要显示文件内容所在的文件
  2. 获取一个字符
  3. 输出一个字符
  4. 重复2.3直至文件末尾截止
  5. 关闭文件

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、创建动态库

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值