标题的顺序是接着之前写的,希望这篇博客对你有帮助
七. 随机读写函数
实际上,无论是读还是写,在一次调用顺序读写函数,文件指针会移到已经读过或者写过的下一个位置,从那个位置开始下一次读和写(在文件没有关闭的前提下,如果关闭了,文件指针会回到最开始的地方进行读写)
1. fseek
根据文件指针的位置和偏移量来定位文件指针
跳转网站
fseek - C++ Reference
注意事项:
- int fseek ( FILE * stream, long int offset, int origin )
返回类型 :int
2. 参数 : stream , offset , origin
stream 是流的指针(适用于文件)
offset 是距离 orgin 位置的偏移量(正数是向右偏移几格,负数是向左偏移几格)
origin 只有三种:
SEEK_SET : 文件指针回到起始位置
SEEK_CUR : 文件指针处于现在位置不动
SEEK_END : 文件指针回到文章的结尾位置
参数类型是 FILE * , long int , int
3. 引用头文件
<stdio.h>
举例
文件的内容:
#include<stdio.h> int main() { FILE* pa = fopen("data.txt", "r"); printf("%c", fgetc(pa)); printf("%c", fgetc(pa)); fseek(pa, -1, SEEK_CUR); printf("%c", fgetc(pa)); fseek(pa, 3, SEEK_SET); printf("%c", fgetc(pa)); fseek(pa, -1, SEEK_END); printf("%c", fgetc(pa)); fclose(pa); pa = NULL; return 0; }
运行结果:
画图分析:
第一次读取数据:
第二次读取数据:
第三次读取数据:
第四次读取数据:
第五次读取数据:
2. ftell
返回文件指针相对于起始位置的偏移量
跳转网站
ftell - C++ Reference
注意事项:
- long int ftell ( FILE * stream )
返回类型 :lonf int(返回的是偏移量)
2. 参数 stream
stream 是流的指针(适用于文件)
参数类型是 FILE *
3. 引用头文件
<stdio.h>
举例
#include<stdio.h> int main() { char ch[] = "ss"; FILE* pa = fopen("data.txt", "r"); fseek(pa, -1, SEEK_END); int tmp = ftell(pa); printf("%d ", tmp); fclose(pa); pa = NULL; return 0; }
运行结果:
画图分析:
3. rewind
让文件指针的位置回到文件的起始位置
跳转网站
rewind - C++ Reference
注意事项:
- void rewind ( FILE * stream )
返回类型 :void
2. 参数 stream
stream 是流的指针(适用于文件)
参数类型是 FILE *
3. 引用头文件
<stdio.h>
举例
#include<stdio.h> int main() { char ch[] = "ss"; FILE* pa = fopen("data.txt", "r"); fseek(pa, -1, SEEK_END); rewind(pa); printf("%c ", getc(pa)); fclose(pa); pa = NULL; return 0; }
运行结果:
八. 文件读取结束的判定
文件读取结束有两者情况:
- 正常的读到文件末尾而结束
- 因为发生读取错误导致文件读取结束
判定导致文件读取结束原因的函数
1 . feof
当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束
跳转网站
feof - C++ Reference
注意事项:
- int feof ( FILE * stream )
返回类型 :int
2. 参数 stream
stream 是流的指针(适用于文件)
参数类型是 FILE *
3. 引用头文件
<stdio.h>
2 . ferror
当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束
跳转网站
ferror - C++ Reference
注意事项:
- int ferror ( FILE * stream )
返回类型 :int
2. 参数 stream
stream 是流的指针(适用于文件)
参数类型是 FILE *
3. 引用头文件
<stdio.h>
feof 和 ferror 举例
#include<stdio.h> int main() { char ch[] = "ss"; FILE* pa = fopen("data.txt", "r"); while (getc(pa) != EOF) { ; } if (ferror(pa)) { printf("文件读取过程发生失败\n"); } else if (feof(pa)) { printf("文件正常遇到结尾\n"); } fclose(pa); pa = NULL; return 0; }
运行结果:
九. 文件缓冲区
缓冲文件系统 :
是指系统自动地在内存中为 程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。缓冲区的大小根据C编译系统决定的。
所以我们往文件里面写入数据时,立刻打开文件,不能确保一定能找当刚才的数据(如果想要获得数据,可以先刷新缓冲区)