c语言|了解文件的随机读写,文件类别、文件缓冲区,文件操作知识点补充(接上文)

文件的操作

老规矩笔记自取~:文件操作进阶笔记
??欢迎喜欢学习C/C++的朋友互关一起努力!!??

文章目录
  • 文件的操作
    • 一、文件的随机读写
      • 1. fseek 定位文件指针函数
      • 2. ftell 当前偏移量函数
      • 3. rewind 返回起始位置函数
    • 二、文本文件和二进制文件
    • 三、feof 读取结束原因
      • 1. 判断是否读取结束
    • 四、文件缓冲区

一、文件的随机读写 1. fseek 定位文件指针函数
根据文件指针的位置和偏移量来定位文件指针
改变原文件指针指向的位置
int fseek( FILE *stream, long offset, int origin );

参数:文件地址,偏移量,起始位置
这里的起始位置分为
SEEK_CUR 当前位置
Current position of file pointer
SEEK_END 文件字符的末位(最后一个字符的下个位置)
【c语言|了解文件的随机读写,文件类别、文件缓冲区,文件操作知识点补充(接上文)】End of file
SEEK_SET 文件起始位置(第一个字符的起始位)
Beginning of file
偏移量右正左负
返回值:成功返回,0
用一段代码感受:
#define _CRT_SECURE_NO_WARNINGS #include #include int main() { //FILE* fp = fopen("C:\\Users\\yujing wang\\Desktop\\test.txt", "w"); //写入 FILE* fp = fopen("C:\\Users\\yujing wang\\Desktop\\test.txt", "r"); //读取 if (fp == NULL) {perror("fopen"); return -1; } //fputs("abcde", fp); //写入abc fseek(fp, 1, SEEK_SET); //第二个字符 printf("%c", fgetc(fp)); fseek(fp, 0, SEEK_CUR); //与上面一样 printf("%c", fgetc(fp)); fseek(fp, -1, SEEK_END); //最后一个字符 printf("%c", fgetc(fp)); fclose(fp); fp = NULL; return 0; }

运行结果和想象的一样
c语言|了解文件的随机读写,文件类别、文件缓冲区,文件操作知识点补充(接上文)
文章图片

2. ftell 当前偏移量函数
返回文件指针相对于起始位置的偏移量
方便我们知道现在文件指针指向哪个位置
long int ftell ( FILE * stream );

参数:文件地址
返回值:偏移量
还是一段代码搞起~
#include #include int main() { FILE* fp = fopen("C:\\Users\\yujing wang\\Desktop\\test.txt", "r"); //读取 if (fp == NULL) {perror("fopen"); return -1; } fseek(fp, 1, SEEK_SET); //指向第二个字符 printf("%ld", ftell(fp)); fclose(fp); fp = NULL; return 0; }

结果符合我们的猜想
c语言|了解文件的随机读写,文件类别、文件缓冲区,文件操作知识点补充(接上文)
文章图片

3. rewind 返回起始位置函数
让文件指针的位置回到文件的起始位置
void rewind ( FILE * stream );

参数:文件地址
返回值:NULL
把刚才的代码再加一行
int main() { FILE* fp = fopen("C:\\Users\\yujing wang\\Desktop\\test.txt", "r"); //读取 if (fp == NULL) {perror("fopen"); return -1; } fseek(fp, 1, SEEK_SET); //指向第二个字符 rewind(fp); printf("%ld", ftell(fp)); fclose(fp); fp = NULL; return 0; }

运行结果
c语言|了解文件的随机读写,文件类别、文件缓冲区,文件操作知识点补充(接上文)
文章图片

偏移量变为0了
二、文本文件和二进制文件
二进制文件:数据在内存中以二进制的形式存储,如果不加转换的输出到外存
文本文件:以ASCII字符的形式存储的文件,如果要求在外存上以ASCII码的形式存储,则需要在存储前转换
一个数据在内存中是怎么存储的呢?
  • 字符一律以ASCII形式存储
  • 数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储
  • 如有整数10000
  • 如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节)
  • 二进制形式输出,则在磁盘上只占4个字节(VS2013测试)
c语言|了解文件的随机读写,文件类别、文件缓冲区,文件操作知识点补充(接上文)
文章图片

三、feof 读取结束原因
在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束
该函数应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束
?feof的用途:是文件读取结束了,判断是不是遇到文件末尾而结束
?ferror的用途:文件读取结束了,判断是不是遇到错误后读取结束
1. 判断是否读取结束
  1. 文本文件读取是否结束,判断返回值是否为EOF (fgetc)或NULL(fgets)
  • fgetc读取结束返回EOF
  • fgets读取结束返回NULL
  • 其他函数请在c++图书馆中查找或者在MSDN中搜索
  1. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数
  • fread判断返回值是否小于实际要读的个数。
四、文件缓冲区 ?ANSIC标准采用“缓冲文件系统”处理的数据文件的
?缓冲文件系统是指系统自动地在内存中为程序中为每一个正在使用的文件,开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。
如图所示
c语言|了解文件的随机读写,文件类别、文件缓冲区,文件操作知识点补充(接上文)
文章图片

其实,在之前的学习过程中,就已经接触了内存缓存区
int main() {int a = 0; while ((a = getchar()) != EOF) {if (('a' <= a && a <= 'z') || ('A' <= a && a <= 'Z')) {printf("YES\n"); } else {printf("NO\n"); }getchar(); //将每次的'\n'除去 }return 0; }

这里的getchar就是将缓冲区未输出的数,取出来
缓冲区的大小根据C编译系统决定的。
?正因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区(fflush)或者在文件操作结束的时候关闭文件(fclose)

    推荐阅读