feof:可以用来判断文件打开失败或者是文件读完了
feeror:如果FILE*
在FILE *流指针中有一个flag标志位,如果文件读写失败的话这个标志位会置一
标准Io之文件定位
Fseek 偏转文件位置(要偏移的文件名,偏移量,偏移从哪里开始)
Offest:偏移量,可正可副
Whence:
SEEK_END:最后一个字符的下一个。再用偏移量写+10的话,就会跳到字符串之后再偏10.这个时候需要写入一个字符,文件的长度才会变大,在偏移量与最后一个字符之间的这部分空白会自动补零
Fseek:成功的话返回值为0,失败的话返回值为-1
Ftell(FILE *stream)文件流指针
返回值为数字,是文件最开始的位置到偏移量(position)之间的字节数
作用:可以获得文件的大小
若在获取文件大小之后还需要对文件进行操作,要先把文件复位
Rewind(FILE *stream)
作用:调用rewind可以直接将指针复位到文件开头
缓冲区
为啥会存在缓冲区;
高速设备 内存
低速设备 硬件,高速设备和低速设备之间不能直接对接
- 输入一个传一个,效率低,硬盘在操作的时候不是以一个字节为单位的(一般512byte)
写入的东西什么时候会从缓冲区到终端或者文件?
1.行缓冲:linebuffer
大小:1K
作用:终端terminal,主要用于人机交互stdout(printf),缓存区满或者遇到\n刷新 1024
行缓存多是关于终端的一些操作
刷新条件:
1.遇到\n刷新
2.绥存区满刷新,会将前1024个全刷出来
3.程序结束刷新,程序必须是正常结束才能看见缓冲区的内容,如果前面有错,也不会刷新
4.fflush刷新 ffflush(stdout);
2.全缓冲:fullbuffer
大小:4k
作用:主要用于文件的读写缓存区满刷新缓存区 4096
对普通文件进行标准I操作,建立的缓存一般为全缓存
刷新条件:这个遇到\n也不会刷新
1.缓存区满刷新(前4k)
2.程序结束刷新
3.fflush来刷新fflush(fp);
3.无缓冲:stderr
大小:0k
作用:主要用于出错处理信息的输出
不对数据缓存直接刷新
printf();==>>stdout
fprintf(strerr,"fopen error s",filename);
界面交互 出错处理
使用gdb查看,FILE结构体,或使用写入数据测试缓冲区。
缓冲区的大小是可以设置
Fprintf():可以格式化输出到一个流文件中,使得信息输出到指定的文件;通过文件流指针来控制
文件IO
操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用 其中有个 文件I0
一般都是对设备文件操作,当然也可以对普通文件进行操作。
一个基于Linux内核的没有缓存的I0机制
文件IO更适合用来操作设备文件,没有缓存,即发了就能走
特性:
.1没有缓存区
.2操作对象不在是流,而是文件描述符FILE* ,本质是一个数,数字代表一个即将被操作的资源: int 0-1023
.3文件描述符
很小的非负的整数
内核每打开一个文件就会获得一个文件描述符
每个程序在启动的时候操作系统默认为其打开三个描述符与流对象匹配:
0 ==>STDIN_FIENO==stdin
1 ==>STDOUT_FILENO==stdout
2 ==>STDERR_FIENO== stderr
stdin,stdout,stderr,===FILE*
Posix:可移植unix标准库
文件IO操作步骤:
Open
Read/write
Close
头文件:
#include<sys/types>
#include<sys/stat.h>
#include<fcntl.h>
函数接口:
Open:打开或者创建文件
追加:源文件内容不动,从最后往进加内容
前面这里指定了0_CREATE权限以后就必须给出这串数字,且前面要加0表八进制
返回值是一个新的文件描述符,如果是-1的话就是打开失败了
Write:
文件描述符,要写入的内容,实际写入的长度(buf的有效长度)
返回值是写入的字节数,但是0也不一定是错的,该函数也可用在网络中,反0也可能只是因为当前网络比较拥塞
Read:
文件描述符,从那里读,最大可以读的长度(即Buf的长度)
read的返回值是实际文件的字节数
Lseek:调整文件位置
Lseek相当于ftell
功能: 定位光标的位置
参数:
fd:文件描述符
offset:偏移量
正:向后偏移
负:向前偏移
零:不偏移
whence:
SEEK SET
SEEK CUR
SEEK END
返回值:
成功返回偏移量
失败返回-1
lseek(fd,0,SEEK END);
fifo,socket,,