文件的分类
d :目录文件- :普通文件c :字符设备文件b :块设备文件l :链接文件p :管道文件s :套接字文件
按存储类型来分
文本文件:存储的是
ASCII
码(
0~127
),以
EOF
End Of File
(
-1
)作为结束符。
一般存储数据量比较大的信息,读取的速度慢
二进制文件:是数据在内存上的原样存储,存储的是二进制的形式。
一般存储中间变量,数据量比较小的信息,读取的速度快
按操作方式来分
带缓冲区的操作:(标准
IO
)高级的文件操作,系统会自动的在内存上给我们分配缓冲区。
不带缓冲区的操作:(文件
IO
)低级的文件操作,系统是不会自动的给我们的程序分配空间,但是如果需要缓冲区的机制,缓冲区就得自己定义了。
![](https://img-blog.csdnimg.cn/7fc8694832e3475eb482c9fa6fc3d743.png)
标准IO和文件IO
区别
标准 IO :1. 标准 IO 是由库函数系统提供的,由 ANSI C 标准定义2. 是带缓冲区的操作,运行效率较高3. 支持跨平台的4. 标准 IO 操作的依据一般是流指针文件 IO :1. 文件 IO 是由操作系统提供的,由 POSIX (可移植操作系统接口)定义2. 没有缓冲区,运行效率没有标准 IO 高3. 不支持跨平台的4. 文件 IO 操作的依据一般是文件描述符(非负整数)
系统调用和库函数
系统调用:操作系统提供给用户直接操作硬件的一组接口
库函数:对系统调用的二次封装
系统调用和库函数的区别
1. 系统调用一般提供基础的功能,库函数提供较为复杂的功能2. 系统调用一般不能重写,库函数可以重写3. 系统调用运行的时间属于机器时间,库函数运行时间属于用户时间4. 系统调用运行空间属于内核空间,库函数运行空间属于用户空间5. 系统调用的返回值一般是非负整数,库函数的返回值不一定6. 系统调用的运行效率没有库函数的高7. 系统调用的移植性没库函数的好
文件描述符和流指针
文件流指针
文件描述符
是一个非负整数,本质是什么?
本质是数组下标
![](https://img-blog.csdnimg.cn/6bfaca89e96743398e2eed010771fbc0.png)
标准IO
缓冲区的方式
全缓冲
缓冲区满了才刷新缓冲区,或者强制刷新缓冲区
![](https://img-blog.csdnimg.cn/33ac8e40d1114eb6a172cc400ff4bcc2.png)
行缓冲
碰到换行符刷新缓冲区、缓冲区满了刷新、或者强制刷新缓冲区
![](https://img-blog.csdnimg.cn/3b7efcf425484798b664028c48a14e88.png)
不缓冲
所有的信息到缓冲区之后直接到文件
![](https://img-blog.csdnimg.cn/29906fe957544cd0ba2abd1a80136616.png)
对文件进行操作
打开文件
函数功能:打开由参数 1 描述的文件,打开的方式由参数 2 确定函数参数 1 :需要被打开的文件的路径函数参数 2 :打开的方式r : 以只读的形式打开文件,文件存在则打开,不存在则报错r+ : 以读、写的形式打开文件,文件存在则打开,不存在则报错w : 以只写的形式打开文件,文件存在则清空打开,文件不存在则新建w+ : 以读、写的形式打开文件,文件存在则清空打开,文件不存在则新建a : 以追加的形式打开文件,文件存在则追加,文件不存在则新建a+ : 以可读可写(追加)的形式打开文件,文件存在则追加,文件不存在则新建函数返回值:成功返回:文件流指针失败返回 NULL ,并且更新 errno
操作文件
以字符读写
函数功能:从 stream 指示的文件中读取字符函数参数:需要读字符的文件流函数返回值:成功返回读到的字符可以是( EOF ,表示读完了),失败返回 -1
函数功能:给 stream 写了一个字符 c函数参数 1 :被写的字符函数参数 2 :给谁写函数返回值:成功返回写入的字符,失败返回 -1
模拟cat命令
以行读写
函数功能:按行读函数参数 1 :读到哪函数参数 2 :读多少(实际读到的是 size-1 ,最后一个空间给 \0 预留) 所以 fgets 相较于 gets 是安全的函数参数 3 :从哪读函数返回值:成功返回非 0 ,返回 NULL 的时候是出错或者没有可读的字符了
判断一个文件有多少行
以对象读写
以格式化读写
关闭文件
main函数传参
标准IO相关函数
文件IO
打开文件
操作文件
关闭文件
对目录文件的操作
打开目录
操作目录
stat
关闭目录
动态库、静态库
区别
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此体积较大。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动
态库存在,因此代码体积较小。
静态库
静态库对函数库的链接是放在编译时期( compile time )完成的。程序在运行时与函数库再无瓜葛,移植方便浪费空间和资源,因为所有相关的对象文件( object file )与牵涉到的函数库( library )被链接合成一个可执行文件( executable file )。--- 》编译时把静态库中的相关代码复制到可执行程序中优点:程序运行时,无需加载库,运行速度更快缺点:占用更多磁盘和内存空间,静态库升级后,需要重新编译链接
动态库
动态库把对一些库函数的链接载入推迟到程序运行的时期( runtime )。可以实现进程之间的资源共享。将一些程序升级变得简单。甚至可以真正做到链接载入完全由程序员在程序代码中控制。---- 》编译时仅记录用到哪个共享库中的哪个符号,不复制共享库中的相关代码优点:程序不包含库中代码,体积比较小,库升级方便,无需重新编译缺点:在运行需要加载共享库
制作动态库