住房和城乡建设部网站官网,网站建设费用价格明细表,东莞网站建设基本流程图,阿里云虚拟主机建站教程前言#xff1a;上篇文章#xff0c;我们已经学习了有关本地磁盘文件的常用文件操作#xff0c;已经能够对本地文件进行调用与读写。我们磁盘中还存在着一些内容用二进制存储的文件#xff0c;这也就是我们今天将要讲解的内容。一、文本文件与二进制文件根据数据的组织形式…前言上篇文章我们已经学习了有关本地磁盘文件的常用文件操作已经能够对本地文件进行调用与读写。我们磁盘中还存在着一些内容用二进制存储的文件这也就是我们今天将要讲解的内容。一、文本文件与二进制文件根据数据的组织形式我们将数据文件称为文本文件和而二进制文件。数据在内存中以二进制的形式存储如果不加转换的输出到外存就是二进制文件;如果要求在外存上以ASCII码的形式存储则需要在存储前转换。以ASCII字符的形式存储的文件就是文 本文件。 那么数据在内存中是如何存储的的呢实际上字符在内存中的存储一律是以ASCII码值得形式进行存储的而数值型数据既可以用ASCII码存储也可以用二进制形式进行存储。例如十进制数字10000在进行存储时就可以有两种存储形式①二进制形式00000000 00000000 00100111 00010000②ASCII码形式00110001 00110000 00110000 00110000 1 0 0 0接着让我们来看看示例#include stdio.h
int main()
{int a 10000;FILE* pf fopen(test.txt, wb);//wb表示只写模式打开二进制文件if (pf NULL){perror(fopen);}else{fwrite(a, 4, 1, pf);//二进制的形式写到文件中//将变量a中的数据每四个字节存储一次写入文件指针pf指向的文件fclose(pf);}pf NULL;return 0;
}在上面这段代码运行成功后我们就已经成功将变量a中的数据写入到本地磁盘对应的txt文件中了可是我们发现当我们尝试打开本地文件查看存储的数据时里面看起来并不是我们所想要的东西导致这样的原因是因为我们使用了“wb”方式即以二进制形式进行了写入而要查看这部分内容我们只需要将文件添加到vs里面并且将打开方式改为二进制编制器。具体步骤选中我们的“源文件”栏右击选择“添加”“添加现有项”将写入时创建的txt文件添加进来然后选中该文件右击选择打开方式接着在选项框中下拉选择“二进制编制器”此时我们便可以看到文件内的实际存储情况了但是这好像也不是我们存储的数据我们再来看看我的的语句fwrite(a,4,1,pf);根据这条语句我们在进行数据写入时是每次四个字节进行写入的于是根据其二进制码可以得到它的存储为00000000 00000000 00100111 00010000我们再将它每四个字节分开来0000 0000 0000 0000 0010 0111 0001 0000于是就可以得到00 00 27 10又因为在之前我们就验证过vs采用的是小端存储模式于是在进行压栈时会将数据进行倒置存储于是就有10 27 00 00 二、文件读取结束的判断1.被错误使用feof函数在我们日常写代码过程有很多人都会错误地使用了feof函数将其用于判断文件是否读取结束而这种使用方式是错误的。大家一定要牢记在文件读取过程中不能用feof函数的返回值直接用来判断文件的是否结束。 而是应用于当文件读取结束的时候判断是读取失败结束还是遇到文件尾结束。 2.判断文件读取结束文本文件判断文件读取结束方法①使用fgetc函数判断是否为EOF②使用fgrts函数判断返回值是否为NULL例如#include stdio.h
#include stdlib.h
int main()
{int c;// 注意int非char要求处理EOFFILE* fp fopen(test.txt, r);if (!fp){perror(File opening failed);return 1;}//fgetc 当读取失败的时候或者遇到文件结束的时候都会返回EOFwhile ((c fgetc(fp)) ! EOF)// 标准C I/O读取文件循环{putchar(c);}//判断是什么原因结束的if (ferror(fp)){puts(I/O error when reading);}else if(feof(fp)){puts(End of file reached successfully);}fclose(fp);fp NULL;return 0;
}二进制文件判断文件读取结束方法使用fread函数判断返回值是否小于实际要读取的数据个数例如#include stdio.h
enum { SIZE 5 };
int main()
{double a[SIZE] { 1.,2.,3.,4.,5. };FILE* fp fopen(test.bin, wb); // 必须用二进制模式fwrite(a, sizeof * a, SIZE, fp); // 写 double 的数组fclose(fp);double b[SIZE];fp fopen(test.bin, rb);size_t ret_code fread(b, sizeof * b, SIZE, fp); // 读 double 的数组if (ret_code SIZE) {puts(Array read successfully, contents: );for (int n 0; n SIZE; n) printf(%f , b[n]);putchar(\n);}else { // error handlingif (feof(fp))printf(Error reading test.bin: unexpected end of file\n);else if (ferror(fp)) {perror(Error reading test.bin);}}fclose(fp);fpNULL
}三、文件缓冲区文件缓冲区是用以暂时存放读写期间的文件数据而在内存区预留的一定空间。ANSIC 标准采用“缓冲文件系统”处理的数据文件的所谓缓冲文件系统是指系统自动地在内存中为程序 中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区装 满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据则从磁盘文件中读取数据输入到内存缓 冲区充满缓冲区然后再从缓冲区逐个地将数据送到程序数据区程序变量等。缓冲区的大小根 据C编译系统决定的。 这边可以通过代码来验证缓冲区#include stdio.h
#include windows.h
int main()
{FILE*pf fopen(test.txt, w);fputs(abcdef, pf);//先将代码放在输出缓冲区printf(睡眠10秒-已经写数据了打开test.txt文件发现文件没有内容\n);Sleep(10000);printf(刷新缓冲区\n);fflush(pf);//刷新缓冲区时才将输出缓冲区的数据写到文件磁盘//注fflush 在高版本的VS上不能使用了printf(再睡眠10秒-此时再次打开test.txt文件文件有内容了\n);Sleep(10000);fclose(pf);//注fclose在关闭文件的时候也会刷新缓冲区pf NULL;return 0;
}
所以大家要注意因为缓冲区的存在数据只有在填满缓冲区后才会进行真正的写入或读取所以在C语言程序代码的编写过程中在对文件进行操作时需要刷新缓冲区并在文件操作结束时关闭文件否则就可能导致文件的读写操作出现问题。总结经过今天的学习我们关于文件操作与管理的内容就学完了大家可以尝试优化自己之前写的通讯录让联系人信息真正意义的保存下来。