IO的笔记

文件的分类

d :目录文件
- :普通文件
c :字符设备文件
b :块设备文件
l :链接文件
p :管道文件
s :套接字文件

按存储类型来分

文本文件:存储的是 ASCII 码( 0~127 ),以 EOF End Of File -1 )作为结束符。
一般存储数据量比较大的信息,读取的速度慢
二进制文件:是数据在内存上的原样存储,存储的是二进制的形式。
一般存储中间变量,数据量比较小的信息,读取的速度快

按操作方式来分

带缓冲区的操作:(标准 IO )高级的文件操作,系统会自动的在内存上给我们分配缓冲区。
不带缓冲区的操作:(文件 IO )低级的文件操作,系统是不会自动的给我们的程序分配空间,但是如果需要缓冲区的机制,缓冲区就得自己定义了。

 标准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. 系统调用的移植性没库函数的好

文件描述符和流指针 

文件流指针

文件描述符 

是一个非负整数,本质是什么?
本质是数组下标

标准IO 

缓冲区的方式

全缓冲

缓冲区满了才刷新缓冲区,或者强制刷新缓冲区

行缓冲 

碰到换行符刷新缓冲区、缓冲区满了刷新、或者强制刷新缓冲区

不缓冲 

所有的信息到缓冲区之后直接到文件

对文件进行操作 

打开文件

函数功能:打开由参数 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 )。
可以实现进程之间的资源共享。
将一些程序升级变得简单。
甚至可以真正做到链接载入完全由程序员在程序代码中控制。
---- 》编译时仅记录用到哪个共享库中的哪个符号,不复制共享库中的相关代码
优点:程序不包含库中代码,体积比较小,库升级方便,无需重新编译
缺点:在运行需要加载共享库

制作动态库

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值