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