一、fseek()
调整position 的位置,来进行读写。
- offset 偏移量,可正可负,whence 是指参考点,是相对于谁。
- 如果是开头,数字大于等于0
位置
- SEEK_SET 初始位置
- SEEK_CUR R以当前postion 为参考点
- SEEK_END 是最后一个的下一个,注意可以为大于0,只有写了,文件的大小会改变,在后面加上数字,其他偏移的数字没有写为0。
总结
- 一般情况函数返回0 成功,返回-1 失败
二、ftell()
功能
可以通过fseek 偏移到最后,调用ftell ,返回一个从开始到当前位置的大小。(把文件的大小)也就是可以返回从开头到postition的位置文件的大小。
注意
获得文件大小之后,对文件后续还有其他操作,必须对pos 进行复位。
三、rewind() 复位
功能
一调他,函数的指针都会复位到开头。没有返回值。
四、总结三个函数的标准格式如下
五、缓冲区
缓冲区在内核里面,没有在a.out里面 ;缓冲区的原因,是高速设备速度不匹配
5.1 行缓冲
- 满足任意一个条件即可,都可以进行刷新。
- 装满之后,要再加一个,相当于要把其挤出来,这样才会到屏幕输出
- 条件是正常结束,如果前面出错了,程序结束还是看不到缓冲区的东西。
5.2 全缓冲
- 这个不认\n,将数据写到文件中,。
- 只有这三个条件都不满足,那么数据都在缓冲区里面,不往文件写
- fflush 在刷新的时候一般写的都是stdout,stdin 调用没有啥影响。
5.3 无缓冲
没有调错机制,那么缓冲的错误信息可能已经在时间上有偏差,所以系统设置了stderr,只要有报错,直接到屏幕,不需要刷新。
六、文件IO
6.1 文件IO基本知识
操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用 其中有个 文件IO
一般都是对设备文件操作,当然也可以对普通文件进行操作。
注意
本质就是一个数字,他不单单是一个数字,代表的是即将被处理的文件
一个基于Linux内核的没有缓存的IO机制
特性:
- 没有缓存区
- 操作对象不在是流,而是文件描述符
- 文件描述符
- 很小的非负的整数 int 0-1023
- 内核每打开一个文件就会获得一个文件 描述符
6.2 open()
open(实际是以前几个的封装) 打开或者创建文件
int open(const char *pathname,int flags,mode_t mode) 666/777 文件执行的权限
第一个是文件名,第二个是标志位(标志位要求如下,必须选择一个,读、写、读写)
除了设置位之后,还要写其他标志位
fopen open 权限设置对应标志
- w O_WRONLY|O_CREAT|O_TRUNC
- w+ O_RDWR|O_CREAT|O_TRUNC
- r O_RDONLY r+ O_RDWR
- a O_WRONLY|O_CREAT|O_APPEND
- a+ O_RDWR|O_CREAT|O_APPEND
- O_CREAT, 创建文件
- O_EXCL,需要和O_CREAT同时使用,表示新建的文件不能存在,成功,否则open就会失败
- O_NOCTTY,不是终端设备
- O_TRUNC文件内容清空
- O_APPEND追加
- O_ASYNC异步io,什么时候io不确定,
- O_NONBLOCK非阻塞
注意
若有create ,必须加权限,一般写0666,前面加0,因为是八进制,若没有则最后一个参数可以忽略不写。
6.3 write()
参数解释
1、写那个文件
2、写入的内容 (既可以写文本,也可以写二进制)
3、写多长度
注意 长度
- strlen(buf)
- sizeof(buf) 这的的大小都是实际大小写入
- count 最好写有效字符长度,否则实际很多都是\0 浪费了。
返回值
成功返回实际写入的字符数,注意0不代表错误。对于某些特殊设备文件。错误返回-1
6.4 close()
关闭文件描述符
6.5 read()
读文件
- 因为要把文件读出来,所以在内存里面开个buf;count 为本次的内容的长度,可以比实际略大
- 返回值是实际的大小,(实际放入的大小)。
- 返回值是0,代表文件到达结尾。
- 小于0没有读到
- read 二进制,文本都可以调用。
6.6 lseek()
4、lseek 对其他三个的封装,实现其他三个的功能;调整文件读写位置
lseek fseek, rewind ftell off_t lseek(int fd, off_t offset, int whence);
功能: 定位光标的位置
参数: fd:文件描述符 对谁
offset:偏移量
- 正:向后偏移
- 负:向前偏移
- 零:不偏移
whence:
- SEEK_SET 文件的最开始
- SEEK_CUR 文件当前的位置
- SEEK_END 文件的最后算 off_t返回值:
- 返回的是从最开始到现在位置的字节数。 成功返回偏移量 失败返回-1