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

📄 filefunction.h

📁 数据结构大作业——变长记录文件存取类库 设计一个类库
💻 H
📖 第 1 页 / 共 4 页
字号:
				   else			
					{   break;   }
				}
			    else
				{ 
					cout << "输入错误\n " << endl;
					break;
				}
			}
		
			else
			{
				cout << "输入记录号错误! " << endl;
				break;
			}
		}

	case 2://删除当前读指针记录
		{
			getread();
			cout << "删除当前读指针文件 \n";
			char ch='n';
			cout << "确认删除? (Y/N) \n" ;
			cin >> ch;
			if( ch =='Y' || ch =='y' || ch =='N' || ch =='n')
			{
			  if( ch =='Y' || ch =='y')
			  {
				if( (*currentread).deletetag==false )
				{
					ofstream deletingFile;
					_unlink((*currentread).fname); // 删除这个文件
					(*currentread).deletetag = true;
					(*currentread).blocklength = 0;
					delete [](*currentread).fname;
					delete [](*currentread).recordtag;
					(*currentread).fname = new char[255];
					strcpy( (*currentread).fname, "C:\\RECYCLED" );
					(*currentread).recordtag = new char[500];
					strcpy( (*currentread).recordtag, "no record");
					cout << "删除成功!" << endl;
					break;
				}
				else
				{
					cout << "该记录之前已被删除\n";
					break;
				}
			  }
			  else
			  { break;}
			}

			else
			{
				cout << "输入错误! " << endl;
				break;
			}
		}
	
	case 3://删除当前写指针记录
		{
			getwrite();
			cout << "删除当前写指针文件 \n";
			char ch='n';
			cout << "确认删除? (Y/N) \n" ;
			cin >> ch;
			if( ch =='Y' || ch =='y' || ch =='N' || ch =='n')
			{
			  if( ch =='Y' || ch =='y')
			  {
				if( (*currentwrite).deletetag==false )
				{
					ofstream deletingFile;
					_unlink((*currentwrite).fname); // 删除这个文件
					(*currentwrite).deletetag = true;
					(*currentwrite).blocklength = 0;
					delete [](*currentwrite).fname;
					delete [](*currentwrite).recordtag;
					(*currentwrite).fname = new char[255];
					strcpy( (*currentwrite).fname, "C:\\RECYCLED" );
					(*currentwrite).recordtag = new char[500];
					strcpy((*currentwrite).recordtag, "no record");
					cout << "删除成功!" << endl;
					break;
				}
				else
				{
					cout << "该记录之前已被删除\n";
					break;
				}
			  }
			  else
			  {  break; }
			}
			 
			else
			{
				cout << "输入错误! " << endl;
				break;
			}
		}
	case 4://查找所有合适的标志并删除
		{
			cout << "按标识删除记录" << endl;
			char *arr=new char[500];
			cout << "请输入标识(也可是其中一段)" << endl;
			cin >> arr;
			int a=0;
			int R[500];
			list<record>::iterator findtemp = Listlink.begin();	
			for( int i=1; i<=dnum || findtemp!=Listlink.end() ; findtemp++,i++)
			{
				string Data1="";
				Data1+=(*findtemp).recordtag;
				if( (Data1.find(arr))!=-1)
				{
					 cout << "与你输入条件匹配的有第" << i << "个记录" << endl;
					 R[a]=i;
					 a++;
				}
			}

			if(a==0)			//记录不存在
			{
				cout << "不存在与您输入条件匹配的记录\n";
			}
			
			if(a==1)			//记录只有一个符合查找条件
			{
				char ch='n';
				cout << "确认删除? (Y/N) \n" ;
				cin >> ch;
				if( ch =='Y' || ch =='y' || ch =='N' || ch =='n')
				{
					if( ch =='Y' || ch =='y')
					{
						list<record>::iterator  deltemp; 
						deltemp = Listlink.begin();
						for( int j=1; j<R[0];j++)
						{
							deltemp++;
						}
						if( (*deltemp).deletetag==false )
						{
							ofstream deletingFile;
							_unlink((*deltemp).fname); // 删除这个文件
							(*deltemp).deletetag = true;
							(*deltemp).blocklength = 0;
							delete [](*deltemp).fname;
							delete [](*deltemp).recordtag;
							(*deltemp).fname = new char[255];
							strcpy( (*deltemp).fname, "C:\\RECYCLED");
							(*deltemp).recordtag = new char[500];
							strcpy( (*deltemp).recordtag, "no record");
							cout << "删除成功!" << endl;
							break;
						} 
						else
						{	
							cout << "该记录之前已被删除\n";
							break;
						}
					}
					else
					{ break; }
				}

				else
				{
					cout << "输入错误\n ";
					break;
				}
			}


			if(a>1)                   //符合条件的不止一个
			{
				int k;
				do
				{
					cout << "请选择\n" ;
					cout << "1------浏览记录" << endl;
					cout << "2------打开文件链接" << endl;
					cout << "3------删除记录" << endl;
					cout << "0------退出" << endl;
				
					cin >> k;
					switch(k)
					{
					case 0:break;
					case 1:                //删除前刻先浏览
						{
							int num;
							int u;
							do
							{
								cout << "请输入记录号" << endl;
								cin >> num;
								filebrowse(num);
								cout << "继续浏览?是请选1,否请选0" << endl;
								cin >> u;
								cout << endl;
							}
							while(u!=0);
							break;
						}
					
					case 2:				//删除前刻先链接打开
						{
							int num;
							int u;
							do
							{							
								cout << "请输入记录号" << endl;
								cin >> num;
								filelink( num );
								cout << "继续链接?是请选1,否请选0" << endl;
								cin >> u;
								cout << endl;
							}
							while(u!=0);
							break;
						}

					case 3:
						{
							int num;
							int u;
							do
							{
								cout << "请输入记录号" << endl;
								cin >> num;
							   	if( num<=dnum )
								{
									char ch='n';
									cout << "确认删除? (Y/N) \n" ;
									cin >> ch;
									if( ch =='Y' || ch =='y' || ch =='N' || ch =='n')
									{	
										if( ch =='Y' || ch =='y')
										{	
											cout << "删除第" << num << "个记录的文件 \n";
											list<record>::iterator  deltemp; 
											deltemp = Listlink.begin();
											for( int i=1; i<num; i++)
											{
													deltemp++;
											}
											if( (*deltemp).deletetag==false )
											{
												ofstream deletingFile;
												_unlink((*deltemp).fname); // 删除这个文件
												(*deltemp).deletetag = true;
												(*deltemp).blocklength = 0;
												delete [](*deltemp).fname;
												delete [](*deltemp).recordtag;
												(*deltemp).fname = new char[255];
												strcpy( (*deltemp).fname, "C:\\RECYCLED");
												(*deltemp).recordtag = new char[500];
												strcpy( (*deltemp).recordtag , "no record");
												cout << "删除成功!" << endl;
												
											}
											else
											{
												cout << "该记录之前已被删除\n";
											}
										}
										else
										{   break; }
									}

									else
									{
										cout << "输入错误\n";
										break;
									}
								cout << "继续删除?是请选1,否请选0" << endl;
								cin >> u;
								cout << endl;
								}
								
								else
								{  cout << "输入错误\n"; break; }
							}
							while(u!=0);
							break;
						}

					default:break;
					}
				}
			    while(k!=0);
			}
		}
	default:break;

	}
  }
  while(z!=0);
}
			

void function::filelink(int b)
//链接文件,若操作系统内存在打开的软件,则可通过该软件实现打开
{
	cout << "开始链接第" << b << "个记录\n";
	list<record>::iterator  linktemp; 
	linktemp = Listlink.begin();
	for( int i=1; i<b; i++)
	{
			linktemp++;
	}
	if( (*linktemp).deletetag==false )
	{
		ifstream FILE;
		FILE.open( (*linktemp).fname, ios::in | ios::binary);
		if( !FILE.fail() )
		{
			system((*linktemp).fname);
			FILE.close();
		}
		else
		{
			cout << "文件不存在!" << endl;
			FILE.close();
			return;
		}
	}
	else
	{
		cout << "该记录已被删除\n";
		return;
	}
}

		
 




void function::sequentialread()     //顺序读
{
	if(  currentread != Listlink.end() )
	{
	  if( (*currentread).deletetag==false )
	  {
		ifstream inf;
		inf.open(  (*currentread).fname , ios::in | ios::binary);
	    
		int i;
		cout << "\n 请选择读取的方式:\n" ;
		cout << "1------在屏幕上显示( 建议仅文本文件选择 )\n";      //直接读出
		cout << "2------通过链接打开( 适用于非文本文件与文本文件)\n";//链接打开
		cin >> i;
		switch(i)
		{
		case 1:
			{
				(*currentread).data="";
				char *arr = new char[6];
				do										//输出所有记录
				{		
				memset(arr,0,6);                   
				inf.read(arr,5);
				(*currentread).data+=arr; 
				}
				while( !inf.eof() );                     //遇到EOF标志停止循环
			
				cout << "\n记录内容:\n";
				cout << setw(100) << setiosflags(ios::left) << (*currentread).data << endl;
				 cout << "记录标志是:\n";
				cout << setw(100) << setiosflags(ios::left) << (*currentread).recordtag << endl;
				if( (*currentread).data_num!=dnum )
				{ 
					currentread++; 
				}                      //调用一次顺序读,当前记录读指针后移一位
				inf.close();
				break;
			}

		case 2:
			{
				system( (*currentread).fname );
				if( (*currentread).data_num!=dnum )
				{ 
					currentread++; 
				}
				break;
			}
		default: 
			{
				cout << "输入错误\n";
				break;
			}
		}
	  }
	  else
	  {
		  cout << "该记录已被删除\n" ;
		  if( (*currentread).data_num!=dnum )
			{ 
				currentread++; 
			}
	  }
	}
		
	if( (*currentread).data_num == dnum ) 
	{
		cout << "记录已全部读取完毕" << endl;
	}
}








void function::sequentialwrite()		//顺序写
{
	if( dnum!=0 )
	{
		list<record>::iterator deltemp=currentwrite;
		deltemp++;
		if( deltemp != Listlink.end() )
		{
			Listlink.erase( deltemp );
			deltemp++;
		}
	}
     
		temp.data_num=dnum+1;
	
		cout << "\n请输入记录标志:\n";
		cin >>temp.recordtag;
		
		cout << "\n顺序写入文件…… \n";
		ofstream ouf;
		ouf.open( temp.fname , ios::out | ios::binary);
		cin.clear();
		cout << "请输入内容: \n";
		cin.get();
		ouf << cin.rdbuf();
		ouf.seekp(0,ios::end);
		long pos=ouf.tellp();
		ouf.seekp(0,ios::beg);
		pos-= ouf.tellp();
		temp.blocklength = pos;					//求文件长度
		ouf.close();

		Listlink.push_back(temp);     
		dnum++;
		currentwrite++;
		cout << "建立第" << (*currentwrite).data_num << "个记录" << endl;
		if(dnum==1)
		{
			currentread++;
		}

		temp.data_num = 0;
		
		temp.fname = new char[255];
		temp.recordtag = new char[500];
		strcpy( temp.recordtag, "no record");
		temp.deletetag = false;
		temp.blocklength = 0;
}



void function::fileopen()
//打开函数,从外存将全部内容写入缓存区。
{
	int i=1;
	int read, write;
	char *file1=new char[10];
	char *buffer4 = new char[20];
	char *buffer5 = new char[20];
	strcpy(file1, ".txt");            //	file1=".txt"
	
	while(1)
	{
		char *file=new char[30];
		char *buffer = new char[20];
		strcpy(file, "c:\\data");     //    file="c:\\data"
		_itoa( i, buffer, 10 );		
		//Convert an integer to a string
		//buffer=1           这里1是一个char
		strcat( file, buffer);        //连接file和buffer, file="c:\\data1"
		strcat( file, file1 );        //链接file和file1, file="c:\\data1.txt"
       
		ifstream fin;
		fin.open( file, ios::in | ios::binary);
		if( !fin.fail() )
		{
			record temp1 ;
			char *buffer1 = new char[20];
			char *buffer2 = new char[20];
			char *buffer3 = new char[20];
			char s[100];
			fin.getline( s, 100);     
			fin.getline( buffer1,20 );    //读出记录号存入buffer1
            temp1.data_num = atoi( buffer1 ); 
			//通过atoi(char *)buffer1转为int

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -