Linux下文件IO详解

学习Linux的同学都知道一句话:Linux下一切皆文件。学会文件基础和文件IO就是步入Linux殿堂重要的几步之一。在学习文件IO之前,我们先要了解一下文件基础和文件IO的定义。

一、文件基础

        文件的概念就是:一组相关数据的有序集合。
        他一共有几种类型:r -- 常规文件  d -- 目录文件  c -- 设备文件  b -- 块设备文件  p -- 管道文件
s -- 套接字文件  l -- 符号链接文件。这里面要特别注意的是管道文件和套接字文件是进程间通讯使用的,可以进行网络通信和本地通信。
        简单的来说:文件就是IO操作的对象!

Linux中有两种操作文件的方法:标准IO和文件IO;接下来将会一一解释:

二、标准IO

        2.1、标准IO介绍       

        标准IO由ANSIC标准定义,是标准C中定义好的一组用来输入输出的API(application program interface);受众方面:标准IO在现在大多数操作系统上都实现了C库,这就使它的使用方法很方便。效率方面:标准IO通过缓冲机制能够减少系统调用,实现更高的效率!具体实现就是在系统APP中开辟一片缓冲区,将要传输的数据集合在一起,当有需要或者满区时才传输。避免了一份数据一传,大大减少了系统调用。

        2.2标准IO - 流

        标准IO的使用离不开流(stream)也叫做FILE。
标准IO中用一个结构体类型(FILE)来存放打开文件的相关信息,标准IO的所有操作都围绕FILE来进行;

        流有三种缓存类型:全缓冲、行缓冲、无缓冲
全缓冲:当流的缓冲区无数据或无空间时才执行实际IO操作,注意:打开的文件默认缓冲为全缓冲
行缓冲:当在输入和输出中遇到换行符'\n'时,才进行IO操作。stdin(标准输入流)、stdout(标准输出流)就是典型的行缓冲。
无缓冲:数据直接写入文件,流不进行缓存。stderr(标准错误流)就是无缓冲流。

上文提到的stdin\stdout\stderr是标准IO预定的三个流,程序运行时会自动打开

Linux下文件IO详解_第1张图片

        2.3、流的打开和关闭 

        Linux下文件IO详解_第2张图片

一般在使用中流指针很有用处,我们通常会定义个FILE*类型的指针来接受流指针。这个函数有两个形参,第一个形参需要输入的是文件的地址或目录名字,第二个参数需要传入的是打开文件时所需要的模式。
Linux下文件IO详解_第3张图片

现在我们来个示例,看看如何打开一个文件!
 

#include 

int main(int argc,  char *argv[])
{
   FILE *fp;
   
   if ((fp = fopen("test.txt", "r+")) == NULL) {
       printf("fopen  error\n");
       return -1;
   }
  

   return  0;
 }

 相反的,有打开流就会有关闭流
Linux下文件IO详解_第4张图片

一定要记得打开了一个流就一定要关闭这个流! 

        2.4读写流

Linux下文件IO详解_第5张图片

         2.4.1按字符输入流

Linux下文件IO详解_第6张图片

我们来个例子来读写流:
Linux下文件IO详解_第7张图片 

         2.4.2按字符输出流

Linux下文件IO详解_第8张图片

同样的,我们来个例子看看怎么输出流:
Linux下文件IO详解_第9张图片 

        2.4.3按行输入输出流: 

Linux下文件IO详解_第10张图片

Linux下文件IO详解_第11张图片 

        2.4.4按对象输入输出流 

Linux下文件IO详解_第12张图片

        2.4.5流的刷新、定位和检测 

Linux下文件IO详解_第13张图片

定位流: 

Linux下文件IO详解_第14张图片 

Linux下文件IO详解_第15张图片 

Linux下文件IO详解_第16张图片 

Linux下文件IO详解_第17张图片 

        2.4.6总结 

使用输入输出函数时:请注意fgets();函数不能用来读取二进制文件,因为fgets会把0当作字符串中的终止符、所以无法读取二进制文件!

 

        三、文件IO 

文件IO是posic(可移植操作系统接口)定义的一组函数,他不提供缓冲机制,每次读写操作都引起系统调用。他的核心概念是文件描述符,它能访问各种类型的文件。在Linux下,标准IO基于文件IO实现!

文件IO每打开一个文件都有一个对应的文件描述符(非负整数),文件IO操作都通过文件描述符来完成。它从零开始分配,依次递增。值得一提的是:0,1,2都分别被:stdin、stdout、stderr所占据。

        3.1文件的打开和关闭

Linux下文件IO详解_第18张图片

第一个参数入口同样为文件的路径,第二个参数则为用户自己选择的模式:
Linux下文件IO详解_第19张图片 

        3.2读取和写入文件以及定位文件

 Linux下文件IO详解_第20张图片

Linux下文件IO详解_第21张图片 

Linux下文件IO详解_第22张图片 

        3.3读取目录、修改文件访问权限和获取文件属性 

Linux下文件IO详解_第23张图片

Linux下文件IO详解_第24张图片 

Linux下文件IO详解_第25张图片 

Linux下文件IO详解_第26张图片 

Linux下文件IO详解_第27张图片 

        四、库的制作和使用

        库是一个二进制文件,包含的代码可被程序调用。库有源码,可以在编程后使用;也可以直接安装二进制包使用。库一般存放在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.添加共享库的加载路径。常用方法:修改环境变量、添加系统配置文件,把路径添加到默认的搜索路径里

 

 

 

 

 

 

 

你可能感兴趣的:(Linux,Ubuntu,linux)