Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!
今天我们来继续学习C语言的文件操作。
我的博客:<但凡.
我的专栏:编程之路
持续更新高质量内容,欢迎点赞、关注!
目录
1、文件的随机读写
1.1 fseek
1.2 ftell
输出结果:编辑
1.3 rewind
2、文件读取结束的判定
测试一:文本文件读取结束
测试二:二进制文件读取结束
3、文件缓冲区
1、文件的随机读写
上一篇我们介绍的各种函数都是顺序读写函数,现在我们来看几个随机读写函数。
1.1 fseek
这个函数可以根据文件指针的位置和偏移量来定位文件指针。
在cplusplus.com上,我们可以看到对这三个参数的介绍:
第一个参数就是文件指针,没什么好说的,毕竟通过上节课的学习我们发现这种文件操作函数基本都要输入文件指针。
第二个参数是偏移量参数,可以为正数,也可以为负数。
第三个参数起始位置,我们可以看到C语言为我们提供了三个起始位置(如上图),
- 文件头
SEEK_SET
0 - 当前位置
SEEK_CUR
1 -
文件尾
SEEK_END
2
我们现在上手演示一下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{FILE* pf=fopen("test.txt", "wb");//打开文件int i = 0;if (pf != NULL){char c[100] = { 0 };strcpy(c, "passion");fputs("add passion", pf);fseek(pf, 4, SEEK_SET);fputs("PASSION", pf);fclose(pf);//关闭文件}return 0;
}
运行后文件内容:
在这串代码中,我们先把add passion输入到文本中,然后再将光标从文件起始位置向后移四位(四个字节),这时光标在p前边。我们从光标处对光标以后文字进行了更改。
1.2 ftell
这个函数可以返回文件指针相对于起始位置的偏移量。
我们直接传如文件指针就行,他会检测光标位置并返回光标位置相较于文本最开始的偏移量。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{FILE* pf=fopen("test.txt", "r");//打开文件int i = 0;if (pf != NULL){char c[100] = { 0 };strcpy(c, "passion");fputs("add passion", pf);fseek(pf, 4, SEEK_SET);int size = ftell(pf);printf("%d", size);fclose(pf);//关闭文件}return 0;
}
输出结果:
1.3 rewind
这个函数可以让文件指针的位置回到文件的起始位置。
这个就不做代码演示了哈~,很简单的。
2、文件读取结束的判定
我们都知道,EOF是文件结束的标志,那么feof呢?
首先我们要弄清楚一个东西:不能用feof的返回值直接来哦按段文件是否结束。feof的作用是:当文件读取结束的时候,判断读取结束的原因是否是:遇到文件尾结束。
1、文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)。
2、二进制文件的读取结束判断。判断返回值是否小于实际要读的个数(fread)。
废话也不多说,我们直接举例来测试测试:
测试一:文本文件读取结束
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{FILE* pf=fopen("test.txt", "r");//打开文件int i = 0;if (pf != NULL){char c;while ((c = fgetc(pf)) != EOF){putchar(c);}if (ferror(pf)){puts("I/0 error when reading");}else if (feof(pf)){puts("End of file reached successfully");}fclose(pf);//关闭文件}return 0;
}
输出结果:
我们文件里的文本为test,他输出我们的文本后打印了End of file reached successfully,说明遇到EOF的原因是文件结束,也就是feof的返回值为真。
测试二:二进制文件读取结束
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{double a[5] = { 1,2,3,4,5 };FILE* pf=fopen("test.bin", "wb");//打开文件,以二进制形式fwrite(a, sizeof * a, 5, pf);//写入数组fclose(pf);double b[5];pf = fopen("test.bin", "rb");//只读形式打开size_t ret_code = fread(b,sizeof *b,5,pf);//读数组,并放入b数组中if (ret_code == 5)//如果fread返回值(从文件中读取的字节数)==5,说明读取完毕{puts("Array read successfully,contents: ");for (int n = 0;n < 5;n++){printf("%f", b[n]);//打印b数组}putchar('\n');}else{if (ferror(pf)){puts("I/0 error when reading");}else if (feof(pf)){puts("End of file reached successfully");}}fclose(pf);//关闭文件return 0;
}
输出结果:
这里首先我要跟大家说明一点,我们上篇介绍的fread和fwrite函数他们的功能是二进制输入和输出。也就是说,他们能更改二进制文件。但是上节课我们让他们更改的是txt文件,因为数据以二进制的形式存储,你以二进制形式更改他们,在打开txt文件时,他们会自动转化成我们能够读懂的数据。
那么在这我创建的是bin二进制文件,常用的文本编译器根本就打不开它,如果你费尽心思打开了他,你也根本读不懂他想表达的意思,因为那是给计算机读的,不是给人看的。
3、文件缓冲区
在C语言文件操作时,其实我们读取文件内容和输入内容到文件时,并不是直接对其进行操作的,而是通过文件缓冲区操作的。
那么我们为什么要有这么一个缓冲区呢?我们带入生活,如果你要搬家,是一个物品一个物品的般好还是把所有物品都装车,一次性运过去好呢?当然是一次性运过去好啊!同样,我们把像输入的字符一个一个先放入缓冲区,等到积攒到了一定的数量,再把缓冲区的字符一次性放到硬盘中,这样就能减少系统的运行压力。
好了,今天的内容就分享到这,觉得有帮助的老铁点带你关注支持一下,我们下次再见!