文件的随机读写也就是说文件指针可以随意移动。
文件的操作方式:
顺序读写:文件指针只能从头移动到尾。
随机读写:文件指针可以随意移动,根据需要。
上面的两种文件读写方式不论是ASCII文件还是二进制文件都是可以的。
文件指针:在磁盘文件操作中有一个文件指针,用来知名当前应进行读写的位置,没有具体变量。
文件流提供一些有关文件指针的成员函数:
对于上面的函数中,“文件中的位置”和“位移量”为long型,以字节为单位。参照位置可以是下面三者之一:
ios::beg文件开头,只是默认值
ios::cur指针当前的位置
ios::end文件末尾
比如:
file.seekg(3)指针移动到第三个字符的位置
file.seekg(-3,ios_base::cur)向前移动三个字符
file.seekg(3,ios_base::cur)向后移动三个字符 等价于 file.seekg(3,file.tellg())因为file.tellg()就是获取指针的当前位置 也等价于 file.seekg(file.tellg()+3)
例子:从键盘输入10个整数,并将其保存到数据文件f1.dat中,再从文件中将数据读出来,显示在屏幕上。具体代码如下:
需要注意的是iofile.seekg(0,ios::beg)这段代码的意思是将文件指针移动到文件开始位置,其中ios::beg表示的是文件的起始位置,而0代表偏移量。
上面的文件打开方式为可读可写方式,所以不能是ifstream 也不能是ofstream而应该是fstream。
随机访问二进制数据文件:利用成员函数移动指针,随机地访问二进制数据文件中,任意位置上的数据,还可以修改文件中的内容。
对于二进制文件的读写来说,如果是在write之前移动指针的话,用的是seekp;如果在read之前移动指针的话,用的是seekg。
上面的程序中,student.dat这个文件在内存中是如何保存的,在二进制文件student2.dat中就是如何保存的。
二进制文件节省空间:用计算机内存储形式进行存储
节省时间:读入进来的格式和计算机存储的形式一样
保密:看不懂
对于上面的程序来说,如果有1000000个数据的话,那么将这些数据都读进内存中的话会导致占用内存太大,计算机运行变慢,所以不太安全;
安全的做法是文件放在磁盘中,用哪个数据就取出哪个数据;
同时还有一个问题就是上面的程序中,如果增加一个数据或者删除一个数据可能会造成大量数据需要向前移动或者向后移动,因此引入索引+随机访问的方案。具体流程如下:
1. 将关键字和偏移量一对一建立索引;
2. 将索引文件导入到内存中;
3.如果想查找某条数据,先从索引中查找到对应的偏移量然后从磁盘中取出就可以了。
4.还可以随索引进行排序,从而可以使用高效算法进行查找。
上面方案的优点在于:
空间优化(索引文件比数据文件小很多),时间优化(将磁盘内容读入到内存中就需要占用很大的内存)
用有序的索引查无序的数据;
数据更新时数据和索引的同步。
location=studentsIndex[i].offset;
dataFile.seekg(location,ios::beg);
dataFile.read((char*)&stu.sizeof(Student))
上面这段程序就是利用索引中的偏移量offset来查找数据;
二进制文件的优点:
1. 便于对数据进行随机访问(尤其和索引配合)
2. 存取效率高;
3. 可以对文件进行压缩处理;
4.存储密度大;
5. 数据文件便于保密。