IO编程:
IO:输入/输出
在我们这门课程中,要学习如何掌握输入/输出
GPIO:通用输入/输出
我们为什么要学习IO编程?
我们代码产生的数据,数据结构产生的数据
这些数据,能保存下来么?
暂时不能保存,这些数据在内存区中,程序结束时,它们也会被释放
在我们学习完IO后,就可以将这些数据,保存在文件上
=========================================================================
IO编程/文件IO:需要掌握向文件进行输入和输出
1>IO编程的基础知识 ----*
2>标准IO ----*
3>时间编程
4>文件IO ----*
5>文件和目录属性
6>静态库和动态库 ----*
================================================================
1>IO编程的基础知识 ----*
1>什么是文件?
文件:一组相关数据的有序集合。
2>按类型分类:(linux系统文件分类)
他们的10位文件属性位,头位:文件类型
在ls -l下,可以看到文件的文件类型和文件权限
drwx-wxrwx 一共10位
111011111
1+3+3+3 :文件类型 用户权限 组权限 其他用户权限
八进制 八进制 八进制
常规文件 标识符:-
ASCII码文件
二进制的文件
目录 标识符:d
字符设备 标识符:c
块设备 标识符:b
有名管道 标识符:p --->多进程线程
套接口 标识符:s --->网络编程
符号链接 标识符:l
3>知晓文件,就需要学习,对文件进行IO?
>>>参考图片
4>系统调用
系统调用
用户空间进程访问内核的接口 ------*提供空间接口
把用户从底层的硬件编程中解放出来
极大的提高了系统的安全性
使用户程序具有可移植性
是操作系统的一部分
5>库函数
库函数 --->printf scanf
库函数为了实现某个功能而封装起来的API集合
提供统一的编程接口,更加便于应用程序的移植
是语言或者应用程序的一部分
6>概念总和
文件描述符
顺序分配的非负整数
内核用以标识一个特定进程正在访问的文件
其他资源(socket、pipe等)的访问标识
标准输入、标准输出和标准出错
由shell默认打开,分别为0/1/2
0--->标准输入(stdin)
1--->标准输出(stdout)
2--->标准错误输出(stderr)
不用缓存的I/O ---->文件IO
通过文件描述符进行访问 --->核心:文件描述符
open()/read()/write()/lseek()/close()…
标准I/O ---->标准IO
通过FILE*进行访问 --->核心:FILE*
printf()/fprintf()/fopen()/fread()/fwrite()/fseek()/fclose()…
全局错误码errno
在errno.h中定义,全局可见
错误值定义为“EXXX”形式,如EACCESS
处理规则
如果没有出错,则errno值不会被一个例程清除,即只有出错时,才需要检查errno值
任何函数都不会将errno值设置为0,errno.h中定义了所有常数都不为0
错误信息输出
strerror() - 映射errno对应的错误信息
perror() – 输出用户信息及errno对应的错误信息
========================================================================
2>标准IO
1>标准IO的概念:
不仅在UNIX系统,在很多操作系统上都实现了标准I/O库
标准I/O库由ANSI C标准说明
标准I/O库处理很多细节,如缓存分配、以优化长度执行I/O等,这样使用户不必关心如
何选择合适的块长度
标准I/O在系统调用函数基础上构造的,它便于用户使用
标准I/O库及其头文件stdio.h为底层I/O系统调用提供了一个通用的接口。
总结:
1>现在很系统都支持标准IO
2>标准IO由C库提供 拥有缓冲区
3>标准IO比较智能化
4>标准IO是基于文件IO开发的
5>标准IO的大部分函数:头文件为stdio.h
2>标准IO的核心
文件指针:流:FILE * --->结构体指针 FILE指针:每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE。
标准I/O库的所有操作都是围绕流(stream)来进行的,在标准I/O中,流用FILE *来描述。 ------*
标准I/O库是由Dennis Ritchie在1975年左右编写的
流(stream)
定义:所有的I/O操作仅是数据简单的从程序移进或者移出,这种字节流,就称为流。
分类:文本流/二进制流。
--->转码不一样
文本流
定义:在流中处理的数据是以字符出现。在文本流中,’\n’被转换成回车符CR和换行符LF的ASCII
码0DH和0AH。而当输出时,0DH和0AH被转换成’\n’
数字2001在文本流中的表示方法为 ‘2’ ‘0’ ‘0’ ‘1’
ASCII: 50 48 48 49
二进制流
定义:流中处理的是二进制序列。若流中有字符,则用一个字节的二进制ASCII码表示;
若是数字,
则用对应的二进制数表示。对’\n’不进行变换
数字2001在二进制流中的表示方法为 00000111 11010001。
标准IO的详解:
缓冲文件系统(高级磁盘IO)--->标准IO
目的:尽量减少使用read/write的调用 --->减少系统调用
定义:系统自动的在内存中为每一个正在使用的文件开辟一个缓冲区,从内存向磁盘输出数据必须先 送到内存缓冲区,装满缓冲区在一起送到磁盘中去。从磁盘中读数据,则一次从磁盘文件将一批数据
读入到内存缓冲区中,然后再从缓冲区逐个的将数据送到程序的数据区。
分类:全缓存,行缓存,不缓存。
全缓冲: --->打开文件
缓冲区刷新条件:
1>程序正常结束
2>文件被关闭 -->fclose
3>缓冲区满了
4>强制刷新 fflush()
行缓冲: --->标准输入/标准输出
缓冲区刷新条件:
1>程序正常结束
2>文件被关闭 -->fclose
3>缓冲区满了
4>强制刷新 fflush()
5>缓冲区中遇到的\n
不缓冲: --->标准错误输出 --->针对报错
非缓冲文件系统 (低级磁盘IO)--->文件IO 定义:依靠于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出。
=======================================================================
有点乱。。。。直接看(下)会比较理想