学习Linux的同学都知道一句话:Linux下一切皆文件。学会文件基础和文件IO就是步入Linux殿堂重要的几步之一。在学习文件IO之前,我们先要了解一下文件基础和文件IO的定义。
文件的概念就是:一组相关数据的有序集合。
他一共有几种类型:r -- 常规文件 d -- 目录文件 c -- 设备文件 b -- 块设备文件 p -- 管道文件
s -- 套接字文件 l -- 符号链接文件。这里面要特别注意的是管道文件和套接字文件是进程间通讯使用的,可以进行网络通信和本地通信。
简单的来说:文件就是IO操作的对象!
Linux中有两种操作文件的方法:标准IO和文件IO;接下来将会一一解释:
标准IO由ANSIC标准定义,是标准C中定义好的一组用来输入输出的API(application program interface);受众方面:标准IO在现在大多数操作系统上都实现了C库,这就使它的使用方法很方便。效率方面:标准IO通过缓冲机制能够减少系统调用,实现更高的效率!具体实现就是在系统APP中开辟一片缓冲区,将要传输的数据集合在一起,当有需要或者满区时才传输。避免了一份数据一传,大大减少了系统调用。
标准IO的使用离不开流(stream)也叫做FILE。
标准IO中用一个结构体类型(FILE)来存放打开文件的相关信息,标准IO的所有操作都围绕FILE来进行;
流有三种缓存类型:全缓冲、行缓冲、无缓冲
全缓冲:当流的缓冲区无数据或无空间时才执行实际IO操作,注意:打开的文件默认缓冲为全缓冲
行缓冲:当在输入和输出中遇到换行符'\n'时,才进行IO操作。stdin(标准输入流)、stdout(标准输出流)就是典型的行缓冲。
无缓冲:数据直接写入文件,流不进行缓存。stderr(标准错误流)就是无缓冲流。
上文提到的stdin\stdout\stderr是标准IO预定的三个流,程序运行时会自动打开
一般在使用中流指针很有用处,我们通常会定义个FILE*类型的指针来接受流指针。这个函数有两个形参,第一个形参需要输入的是文件的地址或目录名字,第二个参数需要传入的是打开文件时所需要的模式。
现在我们来个示例,看看如何打开一个文件!
#include
int main(int argc, char *argv[])
{
FILE *fp;
if ((fp = fopen("test.txt", "r+")) == NULL) {
printf("fopen error\n");
return -1;
}
return 0;
}
一定要记得打开了一个流就一定要关闭这个流!
定位流:
使用输入输出函数时:请注意fgets();函数不能用来读取二进制文件,因为fgets会把0当作字符串中的终止符、所以无法读取二进制文件!
文件IO是posic(可移植操作系统接口)定义的一组函数,他不提供缓冲机制,每次读写操作都引起系统调用。他的核心概念是文件描述符,它能访问各种类型的文件。在Linux下,标准IO基于文件IO实现!
文件IO每打开一个文件都有一个对应的文件描述符(非负整数),文件IO操作都通过文件描述符来完成。它从零开始分配,依次递增。值得一提的是:0,1,2都分别被:stdin、stdout、stderr所占据。
第一个参数入口同样为文件的路径,第二个参数则为用户自己选择的模式:
库是一个二进制文件,包含的代码可被程序调用。库有源码,可以在编程后使用;也可以直接安装二进制包使用。库一般存放在Linux下的/lib和/usr/lib 目录下面。
库是事先编译好的,可以复用的代码。在操作系统(OS)运行的程序基本上都需要使用库,使用库可以大大提高开发效率。当然,Windows和Linux下库文件是不兼容的。Linux下包含静态库和共享库。
静态库的特点:
1.编译(链接)时把静态库中相关代码复制到可执行文件中
2.程序中已包含代码,运行时不需要静态库
3.程序运行时无需加载库,运行速度更快
4.但会占用更多的磁盘空间和内存空间
5.静态库升级后,程序需要重新编译链接
创建静态库的步骤:
1.确定库中函数的功能和接口
2.编写库源码
3.编译生成目标文件
4.创建静态库
5.查看库中符号信息
6.编写应用程序
7.编译并链接应用程序
共享库的特点:
1.编译(链接)时仅记录用到哪个共享库中的哪个符号,不复制共享库中的相关代码
2.程序不包含库中代码,尺寸小,不占用过多磁盘和内存空间
3.多个程序可共享一个库
4.程序运行时需要加载库
5.库升级很方便,无需重新加载编译程序
6.使用更加广泛,大部分时间都是使用共享库
创建共享库的步骤:
1.确定库中函数的功能和接口
2.编写库源码
3.编译生成目标文件:注意此时记得加-fPIC 告诉编译器生成位置无关代码
4.创建共享库。例:libcommon.so.1 库一般已lib开头,.so结尾表示共享库,.1表示版本号
5.为共享库创建链接文件
6.编写应用程序
7.编译应用程序并链接共享库
8.执行程序
9.添加共享库的加载路径。常用方法:修改环境变量、添加系统配置文件,把路径添加到默认的搜索路径里