本文主要介绍文件IO的特点、相关函数、目录以及静态库和动态库,对于文件IO的相关函数中的参数着重理解,静态库和动态库的创建也是非常重要的。
1. 文件IO
特点:
是POSIX(可移植操作系统)定义的一组函数;
不带缓冲;
文件描述符(非负整数);
大多用于设备文件的操作;
2. 相关函数
2.1 打开文件
函数原型:int open(const char *pathname, int flags, mode_t mode);
函数功能:打开文件
参数1:文件打开路径;
参数2:打开方式(O_RDONLY、O_WRONLY、O_RDWR) | O_CREAT/O_EXCL/O_NOCTTY/O_TRUNC/O_APPEND
参数3:文件的权限,一般用8进制数据表示
返回值:成功返回已经打开的文件描述符,失败返回-1
注:
O_CREAT:如果文件不存在,则新建,必须使用第三个参数
O_EXCL:如果新建文件时,文件存在,则报错
O_NOCTTY:使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端。
O_TRUNC:如文件已经存在,那么打开文件时先删除文件中原有数据。
O_APPEND:以追加的方式打开文件,如果文件存在,则追加在文件的末尾。
2.2 关闭文件
函数原型:int close(int fd);
函数功能:关闭文件
参数:open的返回值,已经打开的文件描述符
返回值:成功返回0,失败返回-1
2.3 操作文件
函数原型:ssize_t read(int fd, void *buf, size_t count);
函数功能:读取文件
参数1:文件描述符
参数2:读到内容空间的首地址
参数3:要读的字节数
返回值:成功返回读到的字节数,为0表示到达文件末尾,失败返回-1
函数原型:ssize_t write(int fd, const void *buf, size_t count);
函数功能:写入文件
参数1:文件描述符
参数2:要写的内容的空间的首地址
参数3:要写的字节数
返回值:成功返回写入的字节数,失败返回-1
2.4 Lseek
函数原型:off_t lseek(int fd, off_t offset, int whence);
函数功能:文件的偏移量
参数1:文件描述符
参数2:偏移量
参数3:偏移的位置
3. 目录
3.1 打开目录
函数原型:DIR *opendir(const char *name);
函数功能:打开目录
参数:打开的路径
返回值:成功返回DIR *,失败返回NULL
3.2 读目录
函数原型:struct dirent *readdir(DIR *dirp);
函数功能:读取目录
参数:opendir的返回值
返回值:成功返回struct dirent *,读到末尾或者失败返回NULL
3.3 关闭目录
函数原型:int closedir(DIR *dirp);
函数功能:关闭目录
参数:opendir的返回值
返回值:成功返回0,失败返回-1
4. 静态库和动态库
4.1 库的概念
库是 一个二进制文件,包含的代码可以被程序调用
4.2 静态库的特点
1、编译时将静态库中相关代码复制到可执行文件中
2、程序运行时无需加载库,运行速度快(优点)
3、占用更多的磁盘和内存空间,静态库升级后,程序需要重新编译,库升级不方便(缺点)
4.3 动态库的特点
1、编译时仅记录使用哪个共享库(动态库)中的哪个函数,不复制共享库的相关代码,运行时加载共享库
2、程序不包含中的代码,代码尺寸小(优点)
3、库升级方便,无需重新编译程序(优点)
4、使用最广泛
4.4 创建静态库
1、编写源代码(假设源代码为fileCount.c)
2、将源代码生成对应的.o文件
gcc -c fileCount.c -o fileCount.o
3、静态库的命名规范lib和.a
ar crs libfileCount.a fileCount.o
-->ar:库文件维护程序的名称
-->c:创建一个库,不管库是否存在,都将创建
-->r:在库中插入模板
-->s:创建目标文件索引,在创建较大库的时候能加快时间
4、链接静态库
gcc main.c -o main -L. -LfileCount
-->-L.指的是当前路径
5、运行
./可执行文件名
4.5 创建动态库
1、编写源代码(假设源代码为fileCount.c)
2、将源代码生成对应的.o文件
gcc -c -fPIC fileCount.c -o fileCount.o
-fPIC 生成与位置无关代码,可以在任何位置运行
3、共享库的命名规范 lib库名.so.版本号(数字)
4、-shared:生成动态链接库
gcc -shared -o libfile .so.1 fileCount.o
5、给共享库创建软链接----创建软链接的目的是为了能够让我们的编译器在编译的时候找到共享库
ln -s libfile.so.1 libfile.so
6、编译
gcc main.c -o main -L. -lfile
7、运行
./main
8、将共享库复制到系统库路径下
sudo cp libfile.so /usr/lib
9、再次运行
./可执行文件