具体每一个设备跟一个设备文件如何对应起来又如何访问一个设备呢 ?
我们在linu x C下面进行IO操作的话, 第一种方式就是通过标准IO来实现
这个标准就是C的标准,在C标准不仅定义了语法和关键字,还定义了库需要提供一系列的函数,标准IO实际上就是C库中定义好的一些用于输入和输出的组函数,称为标准IO, 通过这些函数能够很方便的输入输出.既然标准IO是由C库来实现的,那么显然只要有C库那么我们就可以使用标准IO,
两种 : 一种是标准IO 一种是文件IO
什么是系统调用 ?
我们在运行一个程序的时候,有两种不同的方法
1.直接在硬件之上来运行我们的程序 代码这种方式我们可以看到代码是可以直接操作硬件的.这种情 况下是没有操作系统的 裸机代码(单片机开发)
2.在硬件之上首先运行的是我们的操作系统,它也是个软件,用来管理各种资源相当于操作系统把硬件 保护起来,所有对硬件的操作需要操作系统来完成.
为什么需要这样去做呢?
操作系统通常都是多任务的,它可以同时运行多个程序,如果我们运行程序直接操作硬件,不需要通过操作系统,这样做显然非常危险,因为任何一个恶意程序就能够破坏我整个系统,让系统崩溃,所以有操作系统的情况下,不允许程序直接操作硬件的,如果我们应用程序需要访问硬件,通过操作系统提供的这层接口来完成,通过接口我们应用程序向操作系统发请求由我的操作系统去处理这些请求,来完成对硬件的实际的操作,并且把结果返回给我的应用程序.这层接口我们叫系统调用
系统调用记住两点:
第一点:有操作系统的情况下应用程序要访问硬件必须通过操作系统提供的系统 调用接口来完成
第二点:不同的操作系统,它的系统调用接口是不一样的比兼容,像linux和 windows他们就有不同的系统调用接口.
FILE 就是file结构体 , 是我们系统头文件中定义好的, 它就是标准IO中用来代表一个打开文件的一个类型, 所有的操作都是对file结构体进行操作的, 一个file结构体代表一个打开的文件,
有些书上也把FILE结构体体称作叫流, 实际上对应的就是FILE结构体 ,
全缓冲 : 当缓冲区满的时候,才执行实际的文件操作, 这个是指写的时候,
读的时候,首先第一次读的时候首先会把一批数据都读到缓冲区里,然后 每一次从缓冲区中读取内容, 当缓冲区空的时候, 才会从实际的文件中再读一批数据进来.,这种叫全缓冲, 我们标准IO里面当我们打开一个普通文件的时候, 默认的缓冲类型就是全缓冲.
行缓冲 : 当输入和输出的时候遇到换行符 , 最典型的例子就是标准输入流, 和标准输出流, 因为这两个都是和终端相关联的, 所以他们的默认类型都是行缓冲,特别是标准输出 , 它是一个行缓冲,意味着只有缓冲区满或者遇到换行符的时候才会去执行实际的文件的操作所以在编程中, 比如我们经常会打印一些调试信息用printf 打印调试信息的时候一定要记得要加上换行符如果不加换行符的话, 实际上我们打印的信息仅仅是写到标准输出流的缓冲区里并没有写到我们实际的终端上
标准输入流, 标准输出流, 和 标准错误流
读取流的时候,可以根据流中所包含的内容的格式去读写,比如说,我们要读一个文本文件,在文本文件中它包含的对象就应当是字符.所以我们就可以指定以字符为对象去读写,.如果要读写的是一个数据文件,数据文件中存放的都是一些整数.那么我们就应当以一个整型的数为对象去读取这个流
fread:是用来从流中读取若干个对象
第一个参数:指针,缓冲区的首地址.从流中读取若干个对象,若干个对象存放 到这里所指向的缓冲区里,这个缓冲区需要我们在程序中事先要 分配好.
第四个参数:流指针,用来指定从哪一个流中读取数据,
第二个参数:它是用来指定这一次从流中读取的时候,我的每一个对象所占的 大小,如果我们是以字符为对象来读取的话那么每个字符是一个 字节,所以这里的size就应当是1,如果是以整型为对象读取流的话,那么这个size就应当是4,
第三个参数,是用来指定我这一次要从流中读取多少个对象, 每个对象占size大小的字节,也就是说如果流中有足够的数据的 话,我一次从流中读取的字节数应当是每个对象的大小*对象的个数.
返回值: 成功返回实际读取的对象的个数, 出错时返回EOF (-1)
fwrite:第一个参数:指针,缓冲区的首地址.存储n个对象,每个对象是size个字节
第四个参数:流指针,用来指定写入到哪个流指针中.
第二个参数:它是用来指定这一次从写入的时候,我的每一个对象所占的大小,如果我们是以字符为对象来读取的话那么每个字符是一个字节,所以这里的size就应当是1,如果是以整型为对象写入的话,那么这个size就应当是4
返回值: 成功返回实际写入的对象的个数, 出错时返回EOF (-1)
在什么样的情况下流能自动刷新缓冲区?
1.当缓冲区满的时候/流的缓冲区出现换行符的时候
这个时候系统会自动刷新流的缓冲区,把内容写到实际的文件里.这里还分成全缓冲和行缓冲,对于全缓冲来说只有当缓冲区满的时候才会自动去刷新,对于行缓冲来说,无论缓冲区满还是遇到换行符都会自动去刷新,这是第一种情况!
2.当流关闭的时候
当流关闭的时候,系统检查如果流的缓冲区中还有数据,那么会把这些数据写到实际的文件中.刷新这个流
3.fflush专门的函数刷新
通过这个函数去刷新一个指定的流,通过fflush可以在任何时候去刷新一个流