📄 changerecord.cpp
字号:
s=ifs.gcount()/b2;
ofs.write((char*)A, s*b2);
}
break; //退出while(1)循环
}
}
else
{
d=SeqDelete(A, s, x);
if(d)
ofs.write((char*)A, (s-1)*b2);
else
ofs.write((char*)A,s*b2);
break; //处理完最后一个数据块时退出while(1)循环
}
}
delete [] A;
ifs.close();
ofs.close();
remove(fname2);
rename("temp", fname2);
if(d) return true;
else return false;
}
//从由fname2指针所表示的索引有序文件中查找关键字为x.key的索引项并由x带回
//////////////////////////////////////////////////////////////////////////////////////
bool ChangeRecord::IFSearch(char*fname2,IndexItem&x)
{
ifstream ifs(fname2, ios::in|ios::nocreate|ios::binary);
//以输入方式打开由fname2指针所表示的索引有序文件
if(!ifs)
{
cerr<<fname2<<' '<<"not found!"<<endl;
return false;
}
ifs.seekg(0,ios::end);
int b2=sizeof(IndexItem);
int n=ifs.tellg()/b2;
ifs.seekg(0);
int low=0, high=n-1;
while(low<=high)
{
//计算区间中间元素的下标
int mid=(low+high)/2;
//从文件中读入区间中点元素并赋给tm
IndexItem tm;
ifs.seekg(mid*b2);
ifs.read((char*)&tm,b2);
//查找成功后由x带回查找到的索引项并返回真
if(x.key==tm.key)
{
x=tm;
ifs.close();
return true;
}
//在左子表中继续查找
else if(x.key<tm.key)
high=mid-1;
//在右子表中继续查找
else
low=mid+1;
}
ifs.close();
return false; //查找失败返回假
}
//从由fname1指针所表示的记录文件中查找记录标识为x.Mark的记录项并由x带回
//////////////////////////////////////////////////////////////////////////////////////
bool ChangeRecord::MarkSearch(char*fname1,ElemType&x)
{
ifstream ifs(fname1, ios::in|ios::nocreate|ios::binary);
//以输入方式打开由fname1指针所表示的记录文件
if(!ifs)
{
cerr<<fname1<<' '<<"not found!"<<endl;
return false;
}
ifs.seekg(0,ios::end);
int b2=sizeof(ElemType);
int n=ifs.tellg()/b2;
ifs.seekg(0);
for(int i=0;i<n;i++)
{
ElemType tm;
ifs.seekg(i*b2);
ifs.read((char*)&tm,b2);
//查找成功后由x带回查找到的记录项并返回真
if(tm.key!=DeleteMark&&strcmp(x.Mark,tm.Mark)==0)
{
ifs.close();
return true;
}
}
ifs.close();
return false; //查找失败返回假
}
//从由fname1指针所表示的记录文件中查找关键字为x.key的记录项并由x带回
//////////////////////////////////////////////////////////////////////////////////////
bool ChangeRecord::KeySearch(char*fname1,ElemType&x)
{
ifstream ifs(fname1, ios::in|ios::nocreate|ios::binary);
//以输入方式打开由fname1指针所表示的记录文件
if(!ifs)
{
cerr<<fname1<<' '<<"not found!"<<endl;
return false;
}
ifs.seekg(0,ios::end);
int b2=sizeof(ElemType);
int n=ifs.tellg()/b2;
ifs.seekg(0);
for(int i=0;i<n;i++)
{
ElemType tm;
ifs.seekg(i*b2);
ifs.read((char*)&tm,b2);
//查找成功后由x带回查找到的记录项并返回真
if(tm.key!=DeleteMark&&tm.key==x.key)
{
ifs.close();
return true;
}
}
ifs.close();
return false; //查找失败返回假
}
//通过记录标识直接从主文件中查找记录项,查到结果输出
//////////////////////////////////////////////////////////////////////////////////////
void ChangeRecord::MarkSearch2(char*fname1,ElemType&x)
{
ifstream ifs(fname1, ios::in|ios::nocreate|ios::binary);
//以输入方式打开由fname1指针所表示的记录文件
if(!ifs)
{
cerr<<fname1<<' '<<"not found!"<<endl;
return;
}
ifs.seekg(0,ios::end);
int b2=sizeof(ElemType);
int n=ifs.tellg()/b2;
ifs.seekg(0);
for(int i=0;i<n;i++)
{
ElemType tm;
ifs.seekg(i*b2);
ifs.read((char*)&tm,b2);
//查找成功后由x带回查找到的记录项并返回真
if(tm.key!=DeleteMark&&strcmp(x.Mark,tm.Mark)==0)
{
x=tm;
cout<<"=========================================================="<<endl;
cout<<" 查到的记录为"<<endl;
cout<<"=========================================================="<<endl;
if(x.kind==1) //链接方式输出链接文件的二进制内容
{
PrintLinkFile(x);
return;
}
if(x.kind==0) //字节流输出数据内容
{
cout<<setw(20)<<x.key<<setw(20)<<x.Mark
<<setw(x.len+5)<<x.Elem;
return;
}
}
}
ifs.close();
cout<<" ";
cout<<"查找不成功!"<<endl;
return; //查找失败返回假
}
//根据记录标识删除
////////////////////////////////////////////////////////////////////////////
void ChangeRecord::MarkDelete(char*fname1,char*fname2,ElemType&x)
{
ifstream ifs(fname1,ios::in|ios::nocreate|ios::binary);
if(!ifs)
{
cerr<<fname1<<' '<<"not open!"<<endl;
return;
}
ofstream ofs("temp2",ios::out|ios::binary);
if(!ofs)
{
cerr<<"temp2"<<' '<<"not open!"<<endl;
return;
}
int b1=sizeof(ElemType);
ElemType tm;
IndexItem y;
int flags=0;
ifs.seekg(0);
while(!ifs.eof())
{
ifs.read((char*)&tm,b1);
if(ifs.eof())
break;
if(strcmp(tm.Mark,x.Mark)==0&&tm.key!=DeleteMark)
{
y.key=tm.key;
bool k=IFDelete(fname2,y);
if(k)
{
tm.key=DeleteMark;
ofs.write((char*)&tm,b1);
cout<<" ";
cout<<"删除记录标识为"<<x.Mark<<"的记录成功!"<<endl;
}
flags=1;
}
if(strcmp(tm.Mark,x.Mark)!=0)
{
ofs.write((char*)&tm,b1);
cout<<"er"<<endl;
}
}
if(!flags)
{
cout<<" ";
cout<<"记录标识为"<<x.Mark<<"的记录不存在!"<<endl;
ifs.close();
ofs.close();
return;
}
ifs.close();
ofs.close();
remove(fname1);
rename("temp2",fname1);
}
//修改指定的记录标识
////////////////////////////////////////////////////////////////////////////
void ChangeRecord::MarkReplace(char*fname1,ElemType&x)
{
ifstream ifs(fname1,ios::in|ios::nocreate|ios::binary);
if(!ifs)
{
cerr<<fname1<<' '<<"not open!"<<endl;
return;
}
ofstream ofs("temp2",ios::out|ios::binary);
if(!ofs)
{
cerr<<"temp2"<<' '<<"not open!"<<endl;
return;
}
int b1=sizeof(ElemType);
ElemType tm,y;
int flags=0;
int n;
bool k;
while(!ifs.eof())
{
ifs.read((char*)&tm,b1);
if(ifs.eof())
break;
if(strcmp(tm.Mark,x.Mark)==0&&tm.key!=DeleteMark)
{
do
{
cout<<" 输入修改后的记录标识"<<endl;
cout<<" ";
cin>>y.Mark;
k=MarkSearch(fname1,y);
if(k)
{
cout<<" 已存在,重新输入记录标识"<<endl;
cout<<" ";
cin>>y.Mark;
}
n=strlen(y.Mark);
}while(n<1||n>10);
strcpy(tm.Mark,y.Mark);
ofs.write((char*)&tm,b1);
cout<<" ";
cout<<"修改记录标识为"<<x.Mark<<"的记录成功!"<<endl;
flags=1;
continue;
}
if(strcmp(tm.Mark,x.Mark)!=0)
{
ofs.write((char*)&tm,b1);
}
}
if(!flags)
{
cout<<" ";
cout<<"记录标识为"<<x.Mark<<"的记录不存在!"<<endl;
ifs.close();
ofs.close();
return;
}
ifs.close();
ofs.close();
remove(fname1);
rename("temp2",fname1);
}
//重写指定的记录标识的记录内容
////////////////////////////////////////////////////////////////////////////
void ChangeRecord::RecordReplace(char*fname1,ElemType&x)
{
ifstream ifs(fname1,ios::in|ios::nocreate|ios::binary);
if(!ifs)
{
cerr<<fname1<<' '<<"not open!"<<endl;
return;
}
ofstream ofs("temp2",ios::out|ios::binary);
if(!ofs)
{
cerr<<"temp2"<<' '<<"not open!"<<endl;
return;
}
int b1=sizeof(ElemType);
ElemType tm,y;
int flags=0;
char choice=0;
while(!ifs.eof())
{
ifs.read((char*)&tm,b1);
if(ifs.eof())
break;
if(strcmp(tm.Mark,x.Mark)==0&&tm.key!=DeleteMark)
{
cout<<" 是否修改为链接(是/y)";
cin>>choice;
if(choice=='y')
y.kind=1;
else
y.kind=0;
tm.kind=y.kind;
cout<<" 输入重写的数据内容"<<endl;
cout<<" ";
cin>>y.Elem;
tm.len=y.len=strlen(y.Elem);
strcpy(tm.Elem,y.Elem);
ofs.write((char*)&tm,b1);
cout<<" ";
cout<<"重写记录标识为"<<x.Mark<<"的记录成功!"<<endl;
flags=1;
}
if(strcmp(tm.Mark,x.Mark)!=0)
{
ofs.write((char*)&tm,b1);
}
}
if(!flags)
{
cout<<" ";
cout<<"记录标识为"<<x.Mark<<"的记录不存在!"<<endl;
ifs.close();
ofs.close();
return;
}
ifs.close();
ofs.close();
remove(fname1);
rename("temp2",fname1);
}
//链接方式文件的打开
/////////////////////////////////////////////////////////////////////////
void ChangeRecord::PrintLinkFile(ElemType&x)
{
cout<<setw(20)<<x.key<<setw(20)<<x.Mark
<<setw(x.len+5)<<x.Elem<<endl;
char*fname3=x.Elem;
cout<<"=========================================================="<<endl;
cout<<"记录标识为"<<x.Mark<<"的记录采用链接方式,打开文件"<<fname3<<endl;
cout<<"=========================================================="<<endl;
char c;
ifstream finin(fname3,ios::in|ios::nocreate|ios::binary);
if(!finin)
{
cerr<<fname3<<' '<<"not find!"<<endl;
return;
}
while(finin.get(c))
{
cout.put(c);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -