一、标准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下的库不兼容。