续:feof、ferror(检测一个流是否出错)、clearerr(清除一个流出错的标记)。
一、标准IO文件定位
1、fseek(定位)
int fseek(FILE *stream , long offset(偏移长度) , int whence(偏移起始位置))
其中whence:三种宏——>SEEK_SET(开头) 、SEEKZ-CUR(当前) 、SEEK_END(末尾)。
2、ftell
long ftell(FILE *stream)
3、rewind
void rewind(FILE *stream) 复位到开头
二、缓冲区
1、缓冲区在内核中,为了使高速设备(内存) 与 低速设备(硬盘)速度匹配。
2、分类:
(1)行缓冲
有1024字节(1k)空间,适用对象:在写终端(屏幕)terminal时。
刷新条件:①遇到 \n 刷新 ②缓存区满刷新 ③程序正常结束刷新 ④fflush刷新 fflush(stdout)
(2)全缓冲
有4096字节(4k)空间,适用对象:用于文件的读写。
刷新条件:①缓存区满刷新 ②程序正常结束刷新 ③fflush刷新 fflush(fp)
(3)无缓冲
0k空间,适用对象:用于出错处理信息的输出。stderr
三、文件IO
标准IO(C库中) ==封装了==> 系统调用(syscall)==都发送给==> linux内核。
<unistd.h>(系统调用中) <===> <stdio.h>(C库中)。
1、在系统调用中,操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称为文件IO。 适合:设备类文件。
2、特征
(1)无缓冲区;(2)操作对象不是流,是文件描述符。
文件描述符——>本质:很小的非负整数。(代表即将被操作的资源) 0-1023
与流对象匹配:0<——>stdin;1<——>stdout;2<——>stderr。因此文件一般从3开始。
3、步骤
(1)打开(open) (2)读写(read/write) (3)关闭(close)
1)open
int open(const char *pathname , int flags(标志位) , mode_t mode(执行权限))
flags:O_RDONLY、O_WRONLY、O_RDWR、O_CREAT(创建)、O_TRUNC(清空)、O_APPEND(追加)
执行权限:一般文件都为 0666;有O_CREAT时必须写权限。
2)write
ssize_t write(int fd,const void *buf,size_t count(有效长度(实际大小strlen)))
read
ssize_t read(int fd,void *buf,size_t count(最大读取长度(sizeof)))
其返回值为实际读到的大小。
3)close
int close(int fd)
4)lseek
off_t lseek(int fd , off_t offset , int whence)
定位到光标的位置<——>一个函数实现fseek、rewind、ftell所有的功能。
返回值为从文件开头到当前pos位置的字节数。