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;
}
运行结果和想象的一样
文章图片
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;
}
结果符合我们的猜想
文章图片
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;
}
运行结果
文章图片
偏移量变为0了
二、文本文件和二进制文件
一个数据在内存中是怎么存储的呢?二进制文件
:数据在内存中以二进制的形式存储,如果不加转换的输出到外存
文本文件
:以ASCII字符的形式存储的文件,如果要求在外存上以ASCII码的形式存储,则需要在存储前转换
- 字符一律以ASCII形式存储
- 数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储
- 如有整数10000
- 如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节)
- 二进制形式输出,则在磁盘上只占4个字节(VS2013测试)
文章图片
三、feof 读取结束原因
在文件读取过程中,该函数应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束不能
用feof函数的返回值直接用来判断文件的是否结束
?feof的用途:是文件读取结束了,判断是不是1. 判断是否读取结束遇到文件末尾而结束
?ferror的用途:文件读取结束了,判断是不是遇到错误后读取结束
- 文本文件读取是否结束,判断返回值是否为EOF (fgetc)或NULL(fgets)
- fgetc
读取结束
返回EOF
- fgets
读取结束
返回NULL
- 其他函数请在c++图书馆中查找或者在MSDN中搜索
- 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数
- fread判断返回值是否小于实际要读的个数。
?缓冲文件系统是指系统自动地在内存中为程序中为每一个正在使用的文件,开辟一块
“文件缓冲区”
。从内存向磁盘输出数据会先送到内存中的缓冲区
,装满缓冲区
后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。如图所示
文章图片
其实,在之前的学习过程中,就已经接触了内存缓存区缓冲区的大小根据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语言在操作文件的时候,需要做
刷新缓冲区(fflush)
或者在文件操作结束的时候关闭文件(fclose)
推荐阅读
- 我们重新了解付费。
- 拍照一年啦,如果你想了解我,那就请先看看这篇文章
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- django-前后端交互
- 如何在Mac中的文件选择框中打开系统隐藏文件夹
- 使用composer自动加载类文件