滴水逆向联盟

标题: VC++2012编程演练数据结构《20》索引文件 [打印本页]

作者: 大灰狼    时间: 2014-8-26 08:14
标题: VC++2012编程演练数据结构《20》索引文件
索引文件由索引表和主文件两部分构成。
  索引表是一张指示逻辑记录和物理记录之间对应关系的表。索引表中的每项称作索引项。索引项是按键(或逻辑记录号)顺序排列。若文件本身也是按关键字顺序排列,则称为索引顺序文件。否则,称为索引非顺序文件。


(1)索引顺序文件


  (Indexed Sequential File)
  主文件按主关键字有序的文件称索引顺序文件。在索引顺序文件中,可对一组记录建立一个索引项。这种索引表称为稀疏索引。


(2)索引非顺序文件


  (Indexed NonSequentail File)
  主文件按主关键字无序得文件称索引非顺序文件。在索引非顺序文件中,必须为每个记录建立一个索引项,这样建立的索引表称为稠密索引。


注意:


  ① 通常将索引非顺序文件简称为索引文件。
  ② 索引非顺序文件主文件无序,顺序存取将会频繁地引起磁头移动,适合于随机存取,不适合于顺序存取。
  ③ 索引顺序文件的主文件是有序的,适合于随机存取、顺序存取。
  ④ 索引顺序文件的索引是稀疏索引。索引占用空间较少,是最常用的一种文件组织。

  ⑤ 最常用的索引顺序文件:ISAM文件和VSAM文件。

我们创建一个工程



实现索引类如下


[cpp] view plaincopy







调用如下


[cpp] view plaincopy


  • #include "stdafx.h"  
  •   
  • #include<iostream>  
  • #include<stdlib.h>  
  • #include<fstream>  
  • #include<iomanip>  
  • #include "Index.h"  
  • //索引文件的类实现的测试  
  • void main()  
  • {cout<<"运行结果:\n";  
  • //定义保存记录的数组a并初始化  
  • ElemType a[15]={{13,"li"},{18,"liu"},{17,"wphp"},{37,"menrm"},  
  • {8,"ytong"},{22,"zhua"},{24,"push"},{48,"qian"},{34,"tang"},  
  • {57,"shdm"},{55,"kang"},{30,"liuli"},{25,"qiaoh"},  
  • {31,"dukun"},{17,"haiang"}};  
  • //定义保存记录关键字的数组b并初始化  
  • KeyType b[16]={12,18,15,32,6,23,21,48,36,57,45,29,25,38,14,9};  
  • //定义主文件和索引文件的名字,并由字符指针p1和p2所指向  
  • char *p1=".\\HFile1.dat",*p2=".\\HFile1.idx";  
  • int m;//记录个数  
  • InFile<IndexItem,ElemType> myfile;  
  • //利用键盘输入操作主文件、索引文件的插入、删除和查找  
  • while(1) {  
  •     cout<<endl<<"功能号表:"<<endl;  
  •     cout<<"1---向主文件插入若干记录"<<endl;  
  •     cout<<"2---从主文件中删除若干记录"<<endl;  
  •     cout<<"3---从主文件中查找若干记录"<<endl;  
  •     cout<<"4---输出主文件fn1"<<endl;  
  •     cout<<"5---输出索引文件fn2"<<endl;  
  •     cout<<"6---结束运行"<<endl;  
  •     char ch;  
  •     cout<<"请输入你的选择(1-6): ";cin>>ch;  
  •     switch (ch)  
  •     {case '1':cout<<"输入待插入记录个数m:";  
  •        cin>>m;myfile.MFAppend(p1,p2,a,m);break;  
  •     case '2':cout<<"输入待删除记录个数m:";  
  •         cin>>m;myfile.MFDelete(p1,p2,b,m);break;  
  •     case '3':cout<<"输入待查找记录个数m:";  
  •         cin>>m;myfile.MFSearch(p1,p2,b,m);break;  
  •     case '4':myfile.PrintMainFile(p1);break;  
  •     case '5':myfile.PrintIndexFile(p2);break;  
  •     case '6':return;  
  •     default:cout<<"输入选择错误,请重输!"<<endl;  
  • }}}  




效果如下











欢迎光临 滴水逆向联盟 (http://dtdebug.com/) Powered by Discuz! X3.2