Linux文件继续

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 的长度
结果如下

fwrite函数

结果显示

fseek函数

重定位文件内部的指针

参数:第一个为文件指针,第二个是指针的偏移量,第三个是指针偏移起始位置
返回值:重定位成功返回 0 ,否则返回非零值
结果如下
可以不看代码自己练习一下

文件IO和标准IO的区别

文件 IO :是直接调用内核提供的系统调用函数 , 头文件是 unistd.h
标准 IO :是间接调用系统调用函数,头文件是 : stdio.h
结果如下:

缓存

缓存的概念
1. 我们的程序中的缓存,就是你想从内核读写的缓存(数组) ---- 用户空间的缓存
2. 每打开一个文件,内核在内核空间中也会开辟一块缓存,这个叫内核空间的缓存
文件 IO 中的写即是将用户空间中的缓存写到内核空间的缓存中。
文件 IO 中的读即是将内核空间的缓存写到用户空间中的缓存中。
3. 标准 IO 的库函数中也有一个缓存,这个缓存称为 ---- 库缓存
用标准IO时就是用户缓存传递给库缓存,再由库缓存交给内核空间
用文件IO时就是用户缓存直接给内核空间
C 库缓存的特点:
1. 遇到 \n 时,会将库缓存的内容写到内核缓存中,即调用了系统调用函数。
2. 库缓存写满时,会调用系统调用函数,将库缓存内容写到内核缓存中。 1024

 

行缓存

fgets函数

加上fseek的原因是当写完后光标位于最后,如果要是读的话,没有数据,把光标移到最前端,再重新开始读。

结果如下

fputs函数

结果如下

fflush函数

fflush FIFE *fp
把库函数中的缓存内容强制写到内核中。
结果如下

 

标准错误输出

结果如下

rewind函数

等价于fseek函数,可以调整光标的位置

fetell函数

获取当前的位置

gets函数

gets fgets 的区别:
gets() 时不能指定缓存的长度,这样就可能造成缓存越界(如若该行长于缓存长度),写到缓存之后的存储空
间中,从而产生不可预料的后果;
gets() 只能从标准输入中读;
gets() fgets() 的另一个区别是 :gets() 并不将新行符存入缓存中 , fgets 将新行符存入缓存中 ;

puts函数

puts fputs 的区别:
puts() 只能向标准输出中写;
puts() fputs() 的另一个区别是 : puts 输出时会添加一个新行符, fputs 不会添加;

fprintf printf sprintf函数

fprintf 可以输出到文件中,也可输出到显示器,
printf 只能输出到显示器中。

 

sprintf函数

fgetc函数

功能:从文件中读取一个字符;
参数:文件流
返回值:正确为读取的字符,到文件结尾或出错时返回 EOF

fputc函数

功能:写一个字符到文件中
参数:第一个参数为要写的字符,第二个参数为文件流
返回值:成功则返回输入的字符,出错返回 EOF
fputc 有缓存,但不是行缓存函数
 

feof函数

int feof(FILE *stream);
功能:判断是否已经到文件结束
参数:文件流
返回值:到文件结束,返回为非 0 ,没有则返回 0

ferror函数

int ferror(FILE *stream);
功能:判断是否读写错误
参数:文件流
返回值:是读写错误,返回为非 0 ,不是则返回 0

clearerr函数

void clearerr(FILE *stream);
功能:清除流错误
参数:文件流

静态库和动态库的制作

静态库

实例:实现两个数的相减
Linux 操作系统支持的函数库分为:
建立main.c和sub.c
将sub.c变成sub.o
创建静态库
引用静态库
输出结果
静态库, libxxx.a ,在编译时就将库编译进可执行程序中。
优点:程序的 运行环境 中不需要外部的函数库。
缺点:可执行程序大
动态库,又称共享库, libxxx.so ,在运行时将库加载到可执行程序中。
优点:可执行程序小。
int fgetc(FILE *fp)
int fputc(int c, FILE *fp) 缺点:程序的 运行环境 中必须提供相应的库。

动态库

将sub.c变成sub.o

生成动态库

调用

还有一种方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值