fopen函数
打开一个文件,返回一个文件的指针
注:
mode
有以下值:
r
:只读方式打开,文件必须存在
r+
:可读写,文件必须存在
rb+
:打开二进制文件,可以读写
rt+:
打开文本文件,可读写
w:
只写,文件存在则文件长度清
0
,文件不存在则建立该文件
w+:
可读写,文件存在则文件长度清
0
,文件不存在则建立该文件
a:
附加方式打开只写,不存在建立该文件,存在写入的数据加到文件尾,
EOF
符保留
a+
:附加方式打开可读写,不存在建立该文件,存在写入的数据加到文件尾,
EOF
符不保留
wb
:打开二进制文件,只写
wb+:
打开或建立二进制文件,可读写
wt+:
打开或建立文本文件,可读写
at+:
打开文本文件,可读写,写的数据加在文本末尾
ab+:
打开二进制文件,可读写,写的数据加在文件末尾
由
mode
字符可知,上述如
r
、
w
、
a
在其后都可以加一个
b
,表示以二进制形式打开文件
fclose函数
实现结果
fread函数
第一个参数为接收数据的指针
(buff),
也即数据存储的地址
第二个参数为单个元素的大小,即由指针写入地址的数据大小,注意单位是字节
第三个参数为元素个数,即要读取的数据大小为
size
的元素个素
第四个参数为提供数据的文件指针,该指针指向文件内部数据
返回值:读取的总数据元素个数
数组初始化
void *memset(void*buffer, int c, int count)
buffer
:为指针或是数组
c
:是赋给
buffer
的值
count
:是
buffer
的长度
![](https://i-blog.csdnimg.cn/direct/6f6bccfe8b834cada3f86eb1eeec4784.png)
结果如下
![](https://i-blog.csdnimg.cn/direct/27ab74dfd45d4389bec9659614f54bc0.png)
fwrite函数
结果显示
fseek函数
重定位文件内部的指针
参数:第一个为文件指针,第二个是指针的偏移量,第三个是指针偏移起始位置
返回值:重定位成功返回
0
,否则返回非零值
![](https://i-blog.csdnimg.cn/direct/b900fc732dff4140bd394a5a7df47c8b.png)
结果如下
![](https://i-blog.csdnimg.cn/direct/aaca7fb7891a48b8800bd62f1be9d638.png)
可以不看代码自己练习一下
文件IO和标准IO的区别
文件
IO
:是直接调用内核提供的系统调用函数
,
头文件是
unistd.h
标准
IO
:是间接调用系统调用函数,头文件是
: stdio.h
![](https://i-blog.csdnimg.cn/direct/52c4f8186a254b48ae04055ff0114f7b.png)
结果如下:
![](https://i-blog.csdnimg.cn/direct/26088dac81684afabc629db6e47857ff.png)
缓存
缓存的概念
1.
我们的程序中的缓存,就是你想从内核读写的缓存(数组)
----
用户空间的缓存
2.
每打开一个文件,内核在内核空间中也会开辟一块缓存,这个叫内核空间的缓存
文件
IO
中的写即是将用户空间中的缓存写到内核空间的缓存中。
文件
IO
中的读即是将内核空间的缓存写到用户空间中的缓存中。
3.
标准
IO
的库函数中也有一个缓存,这个缓存称为
----
库缓存
用标准IO时就是用户缓存传递给库缓存,再由库缓存交给内核空间
用文件IO时就是用户缓存直接给内核空间
C
库缓存的特点:
1.
遇到
\n
时,会将库缓存的内容写到内核缓存中,即调用了系统调用函数。
2.
库缓存写满时,会调用系统调用函数,将库缓存内容写到内核缓存中。
1024
行缓存
fgets函数
加上fseek的原因是当写完后光标位于最后,如果要是读的话,没有数据,把光标移到最前端,再重新开始读。
结果如下
fputs函数
结果如下
fflush函数
fflush
(
FIFE *fp
)
把库函数中的缓存内容强制写到内核中。
![](https://i-blog.csdnimg.cn/direct/1b784c09eed54c0580c570e3abb3c34f.png)
结果如下
![](https://i-blog.csdnimg.cn/direct/e8923fb9189342d1b3c3eb6cc260bf0b.png)
标准错误输出
结果如下
rewind函数
等价于fseek函数,可以调整光标的位置
fetell函数
获取当前的位置
gets函数
gets
与
fgets
的区别:
gets()
时不能指定缓存的长度,这样就可能造成缓存越界(如若该行长于缓存长度),写到缓存之后的存储空
间中,从而产生不可预料的后果;
gets()
只能从标准输入中读;
gets()
与
fgets()
的另一个区别是
:gets()
并不将新行符存入缓存中
, fgets
将新行符存入缓存中
;
![](https://i-blog.csdnimg.cn/direct/2cb64c5c47144557b079ebf7ce4570f4.png)
![](https://i-blog.csdnimg.cn/direct/778b1e0957954c139ad12f79de13bc26.png)
puts函数
puts
与
fputs
的区别:
puts()
只能向标准输出中写;
puts()
与
fputs()
的另一个区别是
: puts
输出时会添加一个新行符,
fputs
不会添加;
![](https://i-blog.csdnimg.cn/direct/e18dff1eabe840aabd813078d97dcc13.png)
![](https://i-blog.csdnimg.cn/direct/0b3afcd329bc4384805396db5c955f83.png)
fprintf printf sprintf函数
fprintf
可以输出到文件中,也可输出到显示器,
printf
只能输出到显示器中。
![](https://i-blog.csdnimg.cn/direct/54342ca5822243cb8c57762e320f25ed.png)
sprintf函数
fgetc函数
功能:从文件中读取一个字符;
参数:文件流
返回值:正确为读取的字符,到文件结尾或出错时返回
EOF
。
![](https://i-blog.csdnimg.cn/direct/fda1e690fea8481d8bfa1cc5b8f18ec4.png)
![](https://i-blog.csdnimg.cn/direct/e347668f5c3548619623d5488fc32723.png)
fputc函数
功能:写一个字符到文件中
参数:第一个参数为要写的字符,第二个参数为文件流
返回值:成功则返回输入的字符,出错返回
EOF
。
fputc
有缓存,但不是行缓存函数
![](https://i-blog.csdnimg.cn/direct/425814a837ca4198a5a446e43afb8832.png)
![](https://i-blog.csdnimg.cn/direct/0895a36996a5428ea0ca7b605620144b.png)
feof函数
int feof(FILE *stream);
功能:判断是否已经到文件结束
参数:文件流
返回值:到文件结束,返回为非
0
,没有则返回
0
ferror函数
int ferror(FILE *stream);
功能:判断是否读写错误
参数:文件流
返回值:是读写错误,返回为非
0
,不是则返回
0
clearerr函数
void clearerr(FILE *stream);
功能:清除流错误
参数:文件流
![](https://i-blog.csdnimg.cn/direct/bd8bb95cba5e478cbdb5c4c539e01d90.png)
![](https://i-blog.csdnimg.cn/direct/ca6312f70d7945eea4ac769a851f177f.png)
静态库和动态库的制作
静态库
实例:实现两个数的相减
Linux
操作系统支持的函数库分为:
建立main.c和sub.c
![](https://i-blog.csdnimg.cn/direct/5a203beb116e472b9ff455dbd19f1ddb.png)
将sub.c变成sub.o
![](https://i-blog.csdnimg.cn/direct/2f816928ddf3497f83b9b9493a701067.png)
创建静态库
![](https://i-blog.csdnimg.cn/direct/87ee2daef551408eb7eeafe6d9e62bca.png)
引用静态库
![](https://i-blog.csdnimg.cn/direct/bb6116519607441d912c51f50a49cae1.png)
输出结果
![](https://i-blog.csdnimg.cn/direct/a740c4d3faaa47aca9042915e0e68d54.png)
静态库,
libxxx.a
,在编译时就将库编译进可执行程序中。
优点:程序的
运行环境
中不需要外部的函数库。
缺点:可执行程序大
动态库,又称共享库,
libxxx.so
,在运行时将库加载到可执行程序中。
优点:可执行程序小。
int fgetc(FILE *fp)
int fputc(int c, FILE *fp)
缺点:程序的
运行环境
中必须提供相应的库。
动态库
将sub.c变成sub.o
生成动态库
调用
还有一种方法