标准IO之文件定位
1.fseek(目标文件,偏移量,参考点)
功能:将stream流文件中的文件指针从whence位置开始偏移offset字节的长度。
参数:stream 要移动文件指针的目标文件流对象
offset要在文件内偏移的距离,单位字节,如果值为整数,则向文件末尾偏移如果值为负数,则向文件开头偏移偏移的起始位置,由系统定义的三个宏开始。
SEEK SET文件的开头位置 SEEK CUR.文件的当前位置 SEEK END文件的末尾位置
注意:
1.不支持设备文件,一般用于普通文件。
2.如果从文件的指定位置向后偏移过程中已经超过了文件的当前末尾位置,则会自动以"0"来填充文件内容,从而形成一种被称为"空洞文件"的特殊文件。
3.特殊操作:偏移量也可以+n,指针后移,需要写文件,跳过空间自动补\0;以当前Pos为参考点
4.返回值:成功为0,失败为-1;
2.ftell(可以获得文件大小)
可以直接用fseek偏移到最后,返回头文件刚开始到pos的字节数
获得完大小之后,若要复制文件需要将pos移到开头
3.rewind(使读写指针直接复位到0)
缓冲区:
存储类设备为块设备(512byte)计算机有高速低速设备,内存速度非常快,硬盘非常慢,为了让他们速度匹配。缓冲区主要在内核中.
行缓冲
1.遇到\n刷新
2.验证缓冲区满刷新
3.程序正常结束刷新
4.fflush刷新(不调stdin,stdout)
全缓冲
1.缓存区满刷新
2.程序正常结束刷新
3.用fflush fflush(fp)
无缓冲
主要用于错误信息报错,与终端关联
fprintf(标准错误输出)
文件io读写操作
1.操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用。 其中文件IO都是对设备文件操作,当然也可以对普通文件进行操作。
2.一个基于Linux内核的没有缓存的I0机制
3.与标准IO的区别:没有缓存区,操作对象不在是流,而是文件描述符
4.文件描述符:很小的非负的整数,本质为int 0-1023
5.内核每打开一个文件就会获得一个文件描述符
6.在./a.out中,打开文件只开不关只能打开1024个
7.拿到的文件描述符从3开始
8.文件io标准头文件 unistd.h,stdio为c库头文件
9.POSIX可移植标准
10.文件io没有缓冲区:更适合操做硬件操作
11.固态硬盘在硬件层面上也有缓冲区;
12.在./a.out中,打开文件只开不关只能打开1024个
13.c库对系统调用进行封装
1.open
open(文件名,标志位,(666,777读写执行权限))
flag必须包含以下三个其中之一
1.O_RDONLY文件必须存在
2.常用还有O_CREAT创造 O_TRUNC 清空
3.fopen (a+ 追加 文件原来位置不变,在文件最后写),open为O_OPPEND追加
4.如果标志位有creat,要给权限,一般为0666
2.write
write(fd,要写入的内容(字符串,二进制都可以),本次写入有效长度)
返回值:
1.成功返回写入字节数,0不代表错误(特殊设备);
2.失败返回-1;
3.close
close(fd)
4.read
read(读谁,往哪存,数量,最大读取长度)
返回值:
1.成功返回实际得到字节数;二进制最多使用read;
2.文件到达结尾返回 0;
3.失败返回 -1;
文件拷贝
5.lseek
lseek(调整文件读写位置)
off_t lseek(int fd, off_t offset, int whence);
功能:
1.定位光标的位置
2.参数:
fd:文件描述符
3.offset:偏移量:正:向后偏移,负:向前偏移,零:不偏移
whence:SEEK_SET,SEEK_CUR ,SEEK_END
返回值:成功返回偏移量off_t,失败返回-1
默认覆盖写
补充:当文件为NULL时,feof 参数 FILE*fp,检测是否结束,ferror 检测是否出错
文件读取时发生错误
clearer 清除标志位
标签:文件,读写,位置,偏移,IO,缓冲区,SEEK From: https://blog.csdn.net/m0_72137961/article/details/140959243