文件系统总结

一、标准IO介绍及缓冲区

(一)基本概念

1、应用层开发-Linux的app开发

2、什么是I/O

1)狭义:输入设备/输出设备

2)广义:包括usb,网线,网口

3、标准的I/O:标准、通用、任何系统通用

4、一切(I/O)皆文件

5、文件

狭义:磁盘文件

广义:文件读取I/O设备

(二)文件类型

1、常规文件

2、目录文件-索引

3、字符设备文件-键盘鼠标

4、块设备文件-U盘(读入U盘中的常规文件)

5、管道文件

6、套接字文件

7、符号链接文件-快捷方式

(三)系统调用和库函数

1、printf封装了接口,通过接口调用内核中的显卡

2、系统调用-接口

3、库函数-标准:strcpy等也可以进行系统调用 

库函数起到了一个翻译作用,统一调用不同接口

在不同的W/L环境下调用printf等,库函数根据所在的W/L环境,翻译成不同的系统调用接口

(四)标准I/O-介绍

1、库函数很关键

 2、标准I/O-流

1)stream-I/O概念

2)FILE-文件-流

3)标准I/O的所有操作都是围绕FILE来进行的

4)文本流:

二进制流:

5)全缓冲:缓冲区写满才写入磁盘

行缓冲:回车换行

无缓冲:直接写入文件

3、Linux下的标准的三个流

(五)缓冲区实验

1、stdio:标准输入输出的头文件

std:standard

io:I/O输入输出

printf:标准输入输出的一个函数

2、测试行缓冲

没有\n 打印不出来

有\n可以打印出来

二、标准IO的读写(字符、行)

(一)基础知识

1、读取字符返回值和输入参数是int类型 

int既可以处理有符号数又可以处理无符号数,包含两种范围

2、getchar()等同于fgetc(stdin)

但getchar不能读取标准文件的内容

只能读取键盘

3、stdin也是FILE*的指针,是系统定义好的

4、写入文件

1)输出到屏幕:putchar()等同于fputc()

(二)测试

fgetc:

1、如果没有1.txt文件

2、创建1.txt,并写入a

3、多次读出-按顺序

FILE指针中有隐藏的数据结构,读写指针,读写后,指针会后移

关闭后再打开也是从头开始

getchar:会阻塞,等待输入

4、写入

1)错误:没有写权限

2)成功写入

3)r+:修改第一个字符

4)a+:在已有的基础上追加

5、打印

二、按行输入文件(读取整个行)

1、s:读入的地方

size:读的大小

1)真正读出的数据是size-1,后面有一个\0

2)如果取的数据不够的话,回车也算入字符

stream:从哪里读

2、从标准输入读

3、从文件读-结果相同

4、打印所有行

三、按行输出文件(写整个行)

1、

2、输出到屏幕

3、输出到文件

注意输出的文件需要有写权限

三、标准IO:文件打开、关闭及代码实现

(一)文件的打开和关闭概念

1、键盘、鼠标、显示都作为文件被处理

*2、文件的打开(独占)-判断资源可不可用

打开:占用资源

关闭:释放资源

库提供的一个接口-一个库函数

1)FILE是流的结构体类型

2)返回值:成功返回流指针,出错返回NULL-需要判断是不是空指针

3)path:普通文件当前路径不需要加目录,其他要使用完整的路径

4)Mode(模式):

r:读

w:写

a:添加

r+:读写,有内容清零,文件必须存在

w+:读写,有内容清零,没有文件创建

a+:读写,不清零模式,追加末尾

(二)文件的打开实现

3、1)测试r

2)r+

3)w+

成功创建

写入内容后再重新打开-内容消失

4)a

重新写入内容-内容不清空

3、打印错误信息

系统函数出现错误

4、如果成功

5、失败-常用于提示失败信息,所以成功分支一半不用,用于失败分支

6、strerror函数

7、perror库函数需要stdio.h头文件

strerror库函数需要errno.h string.h文件

(三)文件的关闭实现

1、文件的关闭

2、流关闭时会将缓冲区内的数据写进磁盘

3、测试fcolse

当不存在1.txt文件时,发生段错误

创建文件,关闭成功

四、标准IO读写:二进制方式

(一)二进制读写概念

1、ASCII

二进制文件不能通过字符来表示

通过二进制读写来操控文件

void *ptr:读取内容放的位置指针

size_t size:读取块大小

size_t n:读取个数

FILE *fp:读取的文件指针

(二)二进制文件读写代码实现

1、读文件

2、写文件

vi只能查看文本文件,所以看到的二进制文件是乱码

3、在同文件中先写后读

会导致读不出来,因为写完之后读写指针指到了最后

从新打开一个问文件读可以读出

打印成功:

五、文件流的刷新

(一)文件流的刷新

1、刷新流-刷新缓冲区

2、缓冲没有满,什么也不输出

3、加一个刷新流-缓冲区内立即输出

fflush(stdout)

4、写入文件,缓冲区没满

4、加入刷新流

fflush(fp)

(二) 文件流的定位

1、ftell:只能返回两个G以下的文件

2、文件处于a模式(追加)打开下,fseek无效

3、rewind(fp)相当于fseek(fp,0,SEEK_SET);

4、这三个函数只适用2G以下的文件

5、实现

1)覆盖前两个

fseek():将光标从哪个位置移动几个光标

2)修改查看光标

rewind(FILE *fp):光标指向开头

ftell(FILE *fp)查看当前光标位置

六、格式化输入与输出

重点掌握sprintf和sscanf

(一)格式化输入

1、printf:输出到屏幕

sprintf:输出到字符串

     fprintf:输出到文件

2、sprintf演示

3、fprintf演示

(二)格式化输入

1、sscanf:在一个字符串中取出几个数据

2、fscanf:在一个文件中取出几个数据

七、标准IO的练习

1、取时间的函数time

2、localtime将系统时间转换成本地时间

3、sleep函数休眠

4、输出时的强制类型转换

5、time()函数,1秒钟打印一次,1970-1-1至今的时间

6、转换成本地时间

7、输出到文件

只要有sleep(1)就需要考虑缓冲区问题

8、编写行号

1)计算行号

2)代码

八、文件IO的读写

(一)文件IO概念

1、标准IO,是一组函数,不用关心使用什么系统

2、文件IO又称系统IO,系统调用,不同系统提供的一组接口,系统提供的一组文件调用,操作系统提供的API接口函数。

3、posix接口标准---linux/unix系统调用有很多相似。wins实现的不是很好

4、文件io不提供缓冲机制,写一次块,没有函数封装

5、文件IO只有二进制读写

无法判断回车换行,字符串操作建议使用标准IO

6、文件IO的API函数

7、文件IO和标准IO之间不通用,文件打开不能同时使用文件IO和标准IO

*8、文件描述符

f:file

d:descrabution

类似于文件流指针fopen

但是文件描述符不是指针,非负整数

如果文件打开不关闭,指向这个文件的数字不会重复。

9、文件描述的范围0-1023

10、0,1,2特殊含义

0:标准输入

1:标准输出

2:标准出错

对应标准IO

(二)文件IO的打开使用

1、open

返回成功时返回文件描述符

标准IO创建文件,文件IO不创建文件

2、open不能创建设备文件,mknode可以创建设备文件

3、打开文件2个参数,创建文件3个参数,文件实际权限mode - umaks

4、umask

5、普通用户的umask是0002

最大默认权限666

(三)文件IO的关闭使用

对应fclose(fp)

(四)文件IO的读写定位

标准IO的实现依靠文件IO

*(一)读取文件

示例:

*(二)写入文件

1、先写后读

test.txt

*(三)定位文件

九、目录操作和文件属性

*(一)目录的读取

*读取目录

*修改文件访问权限

*获取文件属性

(二)文件属性获取

十、静态库和动态库的属性

(一)静态库的使用

1、库的概念

1、库:别人编译好的可以使用的二进制文件

2、静态库:将代码复制到可执行文件中

占用的磁盘多

3、静态库优缺点

文件必须包含main函数,没有main函数,不能生成可执行文件

4、编写一个静态库函数

hello.c不能生成可执行文件,只能生成.o文件

5、静态库的创建

步骤:

1)编写库文件代码,编译.o

2)ar命令创建libxxx.a文件

ar -rsv libxxx.a xxx.a

静态库名字以lib开头,后缀.a

没有main函数的.c文件不能生成可执行文件

3)静态库默认都是.a

lib开头表示是库函数

4)生成库文件

5)查看静态库文件的信息

6、使用静态库

1)链接错误

在hello函数在编译的源码内没有找到实现

编译没有问题

要找到对应函数的库并链接

2)链接静态库

-L.:在当前目录找

-lxxx:名称

7、生成的test并不依赖库文件,在哪个目录都可以使用

(二)动态库的使用

1、共享库

2、动态库的实现

3、位置无关

动态库必须加这个生成.o文件

动态库会被加载到不同位置

加了-fPIC

不加-fPIC

4、nm查看.o文件

如果不加-fPIC

加了-fPIC

*(三)共享库创建

1、生成动态库

*(四)链接共享库

*(五)加载共享库

1、拷贝-不提倡

2、定义环境变量

3、新建窗口不行-写到环境变量

注意事项:

1、标准的I/O的定义:标准、通用、任何系统通用

2、FILE-文件-流

3、getchar()等同于fgetc(stdin)

但getchar不能读取标准文件的内容

只能读取键盘

4、stdin也是FILE*的指针,是系统定义好的

5、mode模式下的a+,是追加在文件末尾的,w同等条件下是替换。

6、fclose流关闭时会将缓冲区内的数据写进磁盘,读数据清空。

7、在同文件中先写后读会导致读不出来,因为写完之后读写指针指到了最后。

8、缓冲区没满,while循环,程序没有结束,只能依靠加一个刷新流-缓冲区内立即输出fflush(stdout)。

9、标准IO创建文件,文件IO不创建文件

10、umask用来设定文件或目录的初始权限

文件或目录的初始权限=文件或目录的权限-umask权限

11、标准IO的实现依靠文件IO

12、库:别人编译好的可以使用的二进制文件,wins和linux下的库不兼容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值