在c++中怎么删除什么是二进制文件件里的全部信息删除失败又需要怎么办

我们先来说一下为什么要使用什麼是二进制文件件它比文本文件有哪些好处。

用文本方式存储信息不但浪费空间而且不便于检索。例如一个学籍管理程序需要记录所有学生的学号、姓名、年龄信息,并且能够按照姓名查找学生的信息程序中可以用一个类来表示学生:

这种存储方式不但浪费空间,洏且查找效率低下因为每个学生的信息所占用的字节数不同,所以即使文件中的学生信息是按姓名排好序的要用程序根据名字进行查找仍然没有什么好办法,只能在文件中从头到尾搜索

如果把全部的学生信息都读入内存并排序后再查找,当然速度会很快但如果学生數巨大,则把所有学生信息都读人内存可能是不现实的

可以用二进制的方式来存储学生信息,即把 CStudent 对象直接写入文件在该文件中,每個学生的信息都占用 sizeof(CStudent) 个字节对象写入文件后一般称作“记录”。本例中每个学生都对应于一条记录。该学生记录文件可以按姓名排序则使用折半查找的效率会很高。

该成员函数将内存中 buffer 所指向的 count 个字节的内容写入文件返回值是对函数所作用的对象的引用,如 obj.write(…) 的返囙值就是对 obj 的引用

write 成员函数向文件中写入若干字节,可是调用 write 函数时并没有指定这若干字节要写入文件中的什么位置那么,write 函数在执荇过程中到底把这若干字节写到哪里呢答案是从文件写指针指向的位置开始写入。

文件写指针是 ofstream 或 fstream 对象内部维护的一个变量文件刚打開时,文件写指针指向文件的开头(如果以 ios::app 方式打开则指向文件末尾),用 write 函数写入 n 个字节写指针指向的位置就向后移动 n 个字节。

下媔的程序从键盘输入几名学生的姓名和年龄(输入时在单独的一行中按 Ctrl+Z 键再按回车键以结束输入。假设学生姓名中都没有空格)并以什么是二进制文件件形式存储,成为一个学生记录文件 students.dat

例子,用什么是二进制文件件保存学生记录:

则形成的 students.dat 为 72 字节用“记事本”程序打开呈现乱码:
Tom烫烫烫烫烫烫烫烫 Jack烫烫烫烫烫烫烫? Jane烫烫烫烫烫烫烫

第 13 行指定文件的打开模式是 ios::out|ios::binary,即以二进制写模式打开在 Windows平台中,用二进制模式打开是必要的否则可能出错,原因会在《文件的文本打开方式和二进制打开方式的区别》一节中介绍

第 15 行将 s 对象写入攵件。s 的地址就是要写入文件的内存缓冲区的地址但是 &s 不是 char * 类型,因此要进行强制类型转换

该成员函数从文件中读取 count 个字节的内容,存放到 buffer 所指向的内存缓冲区中返回值是对函数所作用的对象的引用。

如果想知道一共成功读取了多少个字节(读到文件尾时未必能读取 count 个字节),可以在 read 函数执行后立即调用文件流对象的 gcount 成员函数其返回值就是最近一次 read 函数执行时成功读取的字节数。gcount 是 istream 类的成员函数原型如下:

read 成员函数从文件读指针指向的位置开始读取若干字节。文件读指针是 ifstream 或 fstream 对象内部维护的一个变量文件刚打开时,文件读指針指向文件的开头(如果以ios::app 方式打开则指向文件末尾),用 read 函数读取 n 个字节读指针指向的位置就向后移动 n 个字节。因此打开一个文件后连续调用 read 函数,就能将整个文件的内容读取出来

下面的程序将前面创建的学生记录文件 students.dat 的内容读出并显示。

第 18 行判断文件是否已經读完的方法和 while(cin>>n) 类似,归根到底都是因为 istream 类重载了 bool 强制类型转换运算符

第 19 行只是演示 gcount 函数的用法,删除该行对程序运行结果没有影响

唎题:编写一个 mycopy 程序,实现文件复制的功能用法是在“命令提示符”窗口输入:
mycopy 源文件名 目标文件名

解题的基本思路是每次从源文件读取一个字节,然后写入目标文件程序如下:

文件存放于磁盘中,磁盘的访问速度远远低于内存如果每次读一个字节或写一个字节都要訪问磁盘,那么文件的读写速度就会慢得不可忍受因此,操作系统在接收到读文件的请求时哪怕只要读一个字节,也会把一片数据(通常至少是 512 个字节因为磁盘的一个扇区是 512 B)都读取到一个操作系统自行管理的内存缓冲区中,当要读下一个字节时就不需要访问磁盘,直接从该缓冲区中读取就可以了

操作系统在接收到写文件的请求时,也是先把要写入的数据在一个内存缓冲区中保存起来等缓冲区滿后,再将缓冲区的内容全部写入磁盘关闭文件的操作就能确保内存缓冲区中的数据被写入磁盘。

尽管如此要连续读写文件时,像 mycopy 程序那样一个字节一个字节地读写还是不如一次读写一片内存区域快。每次读写的字节数最好是 512 的整数倍

}

我要回帖

更多关于 什么是二进制文件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信