IO学习心得

本文详细探讨了文件的分类(按存储类型和操作方式),标准IO与文件IO的区别,以及系统调用、库函数、缓冲区机制和动态/静态库的原理。涉及函数如fopen、fclose、fread等,并介绍了文件描述符和如何使用它们进行文件操作。
摘要由CSDN通过智能技术生成

文件分类

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

IO的分类

标准IO,文件IO

文件的分类

按存储类型来分

文本文件:存储的是 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

缓冲区的方式

全缓冲

 行缓冲

 不缓冲

 对文件进行操作

打开文件

fopen
函数功能:打开由参数 1 描述的文件,打开的方式由参数 2 确定
函数参数 1 :需要被打开的文件的路径
函数参数 2 :打开的方式
r : 以只读的形式打开文件,文件存在则打开,不存在则报错
r+ : 以读、写的形式打开文件,文件存在则打开,不存在则报错
w : 以只写的形式打开文件,文件存在则清空打开,文件不存在则新建
w+ : 以读、写的形式打开文件,文件存在则清空打开,文件不存在则新建
a : 以追加的形式打开文件,文件存在则追加,文件不存在则新建
a+ : 以可读可写(追加)的形式打开文件,文件存在则追加,文件不存在则新建
函数返回值:成功返回:文件流指针
失败返回 NULL ,并且更新 errno

操作文件

以字符读写:
fputc 和 fgetc
以行读写:
fgets 和 fputs
以对象读写:
fread 和 fwrite
以格式化读写:
fscanf fprintf

关闭文件

fclose

main函数传参

 标准IO相关函数

fflsh
feof
判断文件是否到末尾:
time 函数:
time();
localtime()
光标移动:
fseek();
获取光标位置:
ftell();
fileno:

文件IO

打开文件

第二个 open 函数
函数功能:打开文件
函数参数 1 :需要打开的文件路径
函数参数 2 :打开的方式
必须包含如下的其中一个
O_RDONLY : 只读
O_WRONLY : 只写
O_RDWR : 可读可写
还可以有以下的:
O_APPEND: 以追加的形式打开
O_CREAT : 文件存在则打开,不存在则按照 mode 参数描述的权限创建一个普通文件
函数参数 3 :如果文件存在则打开,不存在则按照此参数描述的创建一个普通文件
函数返回值:成功返回文件描述符(非负的最小整数) file description fd
失败返回 -1 ,并且更新 errno

操作文件

read
write

关闭文件

 对目录文件的操作

打开目录

opendir

函数功能:打开目录
函数参数:需要被打开的目录
函数返回值:成功返回目录流指针,失败返回 NULL ,并更新 errno

操作目录

读目录:
readdir
函数功能:读目录
函数参数:要读取的目录
函数返回值:成功返回结构体指针,读完了返回 NULL ,失败返回 NULL
stat
函数功能:获取指定文件的全部信息
函数参数 1 :需要获取的是谁(文件)
函数参数 2 :保存信息的结构体
函数返回值:成功返回 0 ,失败返回 -1 ,并且更新 errno
lstat stat 本身没有什么区别,但是当 pathname 表示的是一个链接文件的时候,返回的成员信息是链接本
身而不是链接指向的文件

关闭目录

 动态库、静态库

什么是库?
是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于 windows linux 的本质不同,因此二 者库的二进制是不兼容的。
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此体积较大。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动
态库存在,因此代码体积较小。

静态库

静态库对函数库的链接是放在编译时期( 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、付费专栏及课程。

余额充值