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