1.文件IO 与标准IO 的区别:
文件IO
1)文件IO是由系统提供的基本IO函数,是和系统绑定的,又称之为系统调用。
2)文件IO的可移植性比较低,因为不同的操作系统有不同的文件IO。
3)文件IO涉及到CPU从用户空间切换到内核空间,C代码调用汇编指令,属于一种 耗时操作,应该尽量减少对文件IO的调用。
标准IO
1)标准IO是根据ANSI标准,对文件IO进行二次封装。
2)提高代码的可移植性,复用性;
3)提高输入输出的效率(设置一个缓冲区,缓冲区满或者满足一定条件后,调用文件IO,陷入内核,由内核完成对硬件的操作,大大减少了对文件IO的调用)。
区别一:是否有缓冲机制。标准IO有缓冲(全缓冲、行缓冲、不缓冲),文件IO无缓冲
区别二:函数来源不同,也就是生产厂家不同。标准IO来自于标准c库,文件IO来自于LINUX内 核,系统调用。
区别三:这两种IO操作文件的入口不一样。标准IO操作的文件入口是文件流,文件IO操作的文件 入口是文件描述符。
区别四:标准IO是凌驾于所有操作系统之上的IO,而文件IO是跟操作系统有关的。
2.缓冲区的分类、大小、操作对象、刷新机制:
标准IO 的数据内容,都是先存放在缓冲区,然后刷新到文件中。
i.全缓冲
操作对象
普通流指针(用fopen函数打开的流指针),FILE*fp指针会去维护一个4K大小的缓冲区;
大小
4K = 4*1024byte = 4096byte
刷新缓冲区机制
-
缓冲区满
-
调用fflush函数强制刷新
-
关闭流指针 fclose(fp);
-
主函数调用return退出;
-
调用exit函数
-
读写转换
ii.行缓冲
操作对象
stdin(标准输入) stdout(标准输出)
大小
1K = 1024byte
刷新缓冲区机制
-
缓冲区满
-
调用fflush函数强制刷新
-
关闭流指针 fclose(fp);
-
主函数调用return退出;
-
调用exit函数
-
遇到'\n'字符
-
读写转换
iii.无缓冲
操作对象
标准错误输出 stderr
大小:0
perror函数调用的就是stderr流指针;
3.文件描述符的本质:
当尝试打开一个文件的时候,系统会自动给这个文件编上一个编号,这个编号就是文件描述符,通过文件描述符来描述这个文件。(无论是用标准IO 还是文件IO)
文件描述符在用户空间,可以帮助 io文件函数(标准文件函数)实现对文件的读写。
4.特殊的流指针,特殊的文件描述符:
5.静态库和动态库的区别、优缺点:
二者的不同点在于代码被载入的时刻不同。
- 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此体积较大,但移植方便。
- 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此存储、运行占存小,但在程序运行时还需要动态库存在,移植性较差。
动态库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。