⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 changerecord.cpp

📁 数据结构大作业的非界面版
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -