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

📄 fileswap.h

📁 简单的Dos界面的文本编辑器
💻 H
📖 第 1 页 / 共 3 页
字号:
   {
	   //long int tmplfp=0;       //temp file point 
	   char str[128]="";
	   // tempfp[checkfile[0]-1] is the first part,line lnum is in tempfp[checkfile[0]-1]
	   if(ipflag==0)
	   {
		   long int sumline;   //sign how many line tempfp[checkfile[0]-1] have after insert the others   
		   fseek(tempfp[checkfile[0]-1],currentfp[checkfile[0]-1],0);
		   //write others to tempfp[checkfile[0]-1]
		   for(int i=1; i<3; i++ )
		   {
			   //write line in memory to tempfp[checkfile[0]-1]
			   if(checkfile[i]==0)
			   {
				   for(int j=1; j<=signfile[0][1]; j++ )
				   {
					   strp=GetLine(1);
					   fputs(strp,tempfp[checkfile[0]-1]);
					   BlockFile::DeleteLine(1);
					   delete strp;
				   }
			   }
			   else  //write line in tempfp[checkfile[i]-1] to tmepfp[checkfile[0]-1
			   {
				   rewind(tempfp[checkfile[i]-1]);
				   long int j=1;
				   while(j++<=signfile[checkfile[i]][1])
				   {
					   fgets(str,128,tempfp[checkfile[i]-1]);
					   fputs(str,tempfp[checkfile[0]-1]);
				   }
			   }
		   }
		   sumline=signfile[0][1]+signfile[1][1]+signfile[2][1];
		   //find line lnum
		   rewind(tempfp[checkfile[0]-1]);
		   for( long int j=signfile[checkfile[0]][0]; j<lnum; j++ )
		   {
			   fgets(str,128,tempfp[checkfile[0]-1]);
		   }//after it ,file pointer point to the head of line lnum in tempfp[checkfile[0]-1]
		   currentfp[checkfile[0]-1]=ftell(tempfp[checkfile[0]-1]);   
		   //tmplfp=currentfp[checkfile[0]-1];        //save the beginning point of line lnum
		   long cntl=lnum;                          //cntl is used to maintain the line num
		   //write the line after lnum-1 to memory and tempfp[checkfile[2]-1]
		   for( j=1; j<3; j++ )
		   {
			   if(checkfile[j]==0 )
			   {
				   fseek(tempfp[checkfile[0]-1],currentfp[checkfile[0]-1],0);
				   for(int i=0;i<line_in_swap && cntl<=sumline;i++)
				   {
					   fgets(str,128,tempfp[checkfile[0]-1]);
					   InsertLine(str,i);
					   cntl++;
				   }
				   //InsertLine(input,1);
			   }
			   else
			   {
				   rewind(tempfp[checkfile[j]-1]);
				   if( cntl==lnum+line_in_swap )          //imply checkfile[1]==0
				   {
					   for( ; cntl<=sumline; cntl++ )
					   {
						   fgets(str,128,tempfp[checkfile[0]-1]);
						   fputs(str,tempfp[checkfile[j]-1]);
					   }
				   }
				   else  //cntl <=lnum+line_in_swap
				   {
					   if(cntl <= sumline)     //checkfile[1]!=0
					   {
						   for(int k=0; k<=(line_in_swap-1) && k+lnum<=sumline; k++)
						   {
							   fgets(str,128,tempfp[checkfile[0]-1]);
						   }
						   if(lnum+line_in_swap<=sumline)
						   {
							   for(int i=lnum+line_in_swap; i<=sumline;i++)
							   {
								   fgets(str,128,tempfp[checkfile[0]-1]);
								   fputs(str,tempfp[checkfile[j]-1]);
							   }
						   }
					   }
					   else
					   {
						   //the line last in tempfp[checkfile[0]-1] after lnum-1 is less than line_in_swap
					   }
				   }
				   currentfp[checkfile[j]-1]=ftell(tempfp[checkfile[j]-1]);
			   }
		   }
		   signfile[checkfile[0]][0]=1;
		   signfile[checkfile[0]][1]=lnum-1;
		   for(j=1; j<3; j++ )
		   {			   			   
			   if(checkfile[j]==0)
			   {
				   signfile[checkfile[j]][0]=lnum;
				   signfile[checkfile[j]][1]=GetLcnt();
			   }
			   else
			   {   
				   rewind(tempfp[checkfile[j]-1]);
				   long int tmpp=ftell(tempfp[checkfile[j]-1]);
				   if( currentfp[checkfile[j]-1]==tmpp )
				   {
					   signfile[checkfile[j]][0]=0;
					   signfile[checkfile[j]][1]=0;
				   }
				   else
				   {
					   signfile[checkfile[j]][0]=lnum+line_in_swap;
					   signfile[checkfile[j]][1]=sumline-lnum-(line_in_swap-1);
				   }
			   }
		   }
		   if(checkfile[1]!=0)
		   {
			   int swap;
			   swap=checkfile[2];
			   checkfile[2]=checkfile[1];
			   checkfile[1]=swap;
		   }
		   linen=Insert(input,lnum);       //save the new current line
		   if( linen > lnum )
			   current=linen;
		   else
			   current=lnum+1;
		   return current;
	   }
	   // line lnum is in tempfp[checkfile[1]-1]
	   if(ipflag==1)
	   {
		   long int cntlfp=1;
		   fseek(tempfp[checkfile[1]-1],currentfp[checkfile[1]-1],0);
		   //checkfile[2] is sign a temp
		   if(checkfile[0]==0)
		   {
			   long int sumline=1;       //count line in tmepfile
			   rewind(tempfp[checkfile[2]-1]);
			   while(cntlfp++<=signfile[checkfile[2]][1])//write tempfp[checkfile[2]-1] to tempfp[checkfile[1]-1]
			   {
				   fgets(str,128,tempfp[checkfile[2]-1]);
				   fputs(str,tempfp[checkfile[1]-1]);
			   }
			   //move line in memory to tempfp[checkfile[2]-1]
			   rewind(tempfp[checkfile[2]-1]);
			   for(long int i=1; i<=signfile[0][1]; i++)
			   {
				   strp=GetLine(1);
				   fputs(strp,tempfp[checkfile[2]-1]);
				   BlockFile::DeleteLine(1);
				   delete strp;
			   } 
			   //find the line lnum 's beginning filepoint and copy line before lnum to tempfp[checkfile[2]-1]
			   rewind(tempfp[checkfile[1]-1]);
			   for( i=signfile[checkfile[1]][0]; i<lnum; i++ )
			   {
				   fgets(str,128,tempfp[checkfile[1]-1]);
				   fputs(str,tempfp[checkfile[2]-1]);
			   }
			   currentfp[checkfile[2]-1]=ftell(tempfp[checkfile[2]-1]);
			   //copy lnum to lnum +(line_in_swap-1) to memory if left enough
			   sumline=signfile[checkfile[1]][0]+signfile[checkfile[1]][1]+signfile[checkfile[2]][1]-1;//the max line num
			   for(long int j=0; j<line_in_swap && (j+lnum-1)<sumline; j++ )
			   {
				   fgets(str,128,tempfp[checkfile[1]-1]);
				   InsertLine(str,j);
			   }
			   //InsertLine(input,0);
               //move the last lines to end of tempfp[checkfile[2]-1] temporarily if able
			   for(j=lnum+line_in_swap; j<=sumline; j++ )
			   {
				   fgets(str,128,tempfp[checkfile[1]-1]);
				   fputs(str,tempfp[checkfile[2]-1]);
			   }
			   rewind(tempfp[checkfile[1]-1]);
			   fseek(tempfp[checkfile[2]-1],currentfp[checkfile[2]-1],0);
			   for( j=lnum+line_in_swap; j<=sumline; j++)
			   {
				   fgets(str,128,tempfp[checkfile[2]-1]);
				   fputs(str,tempfp[checkfile[1]-1]);
			   }			   
			   currentfp[checkfile[1]-1]=ftell(tempfp[checkfile[1]-1]);
			   checkfile[0]=checkfile[2];
			   checkfile[2]=checkfile[1];
			   checkfile[1]=0;
			   signfile[checkfile[0]][0]=signfile[0][0];
			   signfile[checkfile[0]][1]=signfile[0][1]+lnum-signfile[checkfile[2]][0];
			   signfile[checkfile[1]][0]=lnum;
			   signfile[checkfile[1]][1]=GetLcnt();
			   if(lnum+line_in_swap<=sumline)
			   {
				   signfile[checkfile[2]][0]=lnum+line_in_swap;
				   signfile[checkfile[2]][1]=sumline-lnum-(line_in_swap-1);		   
			   }
			    else   //tempfp[checkfile[1]-1] is empty
			   {
				   signfile[checkfile[2]][0]=0;
				   signfile[checkfile[2]][1]=0;
			   }
				linen=Insert(input,lnum);       //save the new current line
				if( linen > lnum )
					current=linen;
				else
					current=lnum+1;
				return current;
		   }
		   else  //tempfp[checkfile[0]-1] is the first part
		   {
			   fseek(tempfp[checkfile[1]-1],currentfp[checkfile[1]-1],0);
			   fseek(tempfp[checkfile[1]-1],currentfp[checkfile[0]-1],0);
			   //read line in memory to tempfp[checkfile[1]-1]
			   for( long int i=1; i<=signfile[0][1]; i++ )
			   {
				   strp=GetLine(1);
				   fputs(strp,tempfp[checkfile[1]-1]);
				   BlockFile::DeleteLine(1);
				   delete strp;
			   }
			   //find head pointer of line lnum
			   rewind(tempfp[checkfile[1]-1]);
			   for( i=signfile[checkfile[1]][0]; i<lnum; i++ )
			   {
				   fgets(str,128,tempfp[checkfile[1]-1]);
				   fputs(str,tempfp[checkfile[0]-1]);
			   }
			   currentfp[checkfile[0]-1]=ftell(tempfp[checkfile[0]-1]);
			   //read lnum to lnum+(line_in_swap-1) or the end of tempfp[checkfile[1]-1] to memory
			   long int sumline=signfile[0][0]+signfile[0][1]-1;
			   int j=0;
			   for( i=lnum; i<=sumline && j<line_in_swap; i++,j++ )
			   {
				   fgets(str,128,tempfp[checkfile[1]-1]);
				   InsertLine(str,j);
			   }
			   //InsertLine(input,0);
			   if(lnum+line_in_swap<=sumline)          //there is line left in tempfp[checkfile[1]-1]
			   {
				   for( int i=lnum+line_in_swap; i<=sumline; i++ )
				   {
					   fgets(str,128,tempfp[checkfile[1]-1]);
					   fputs(str,tempfp[checkfile[0]-1]);
				   }
				   fseek(tempfp[checkfile[0]-1],currentfp[checkfile[0]-1],0);
				   rewind(tempfp[checkfile[1]-1]);
				   for( i=lnum+line_in_swap; i<=sumline; i++ )
				   {
					   fgets(str,128,tempfp[checkfile[0]-1]);
					   fputs(str,tempfp[checkfile[1]-1]);
				   }
				   currentfp[checkfile[1]-1]=ftell( tempfp[checkfile[1]-1] );
				   signfile[checkfile[1]][0]=lnum+line_in_swap;
				   signfile[checkfile[1]][1]=sumline-lnum-(line_in_swap-1);
				   signfile[checkfile[2]][0]=lnum;
				   signfile[checkfile[2]][1]=GetLcnt();
			   }
			   else        //tempfp[checkfile[1]-1] is empty
			   {
				   rewind(tempfp[checkfile[1]-1]);
				   currentfp[checkfile[1]-1]=ftell(tempfp[checkfile[1]-1]);
				   signfile[checkfile[1]][0]=0;
				   signfile[checkfile[1]][1]=0;
				   signfile[checkfile[2]][0]=lnum;
				   signfile[checkfile[2]][1]=GetLcnt();
			   }
			   signfile[checkfile[0]][1]+=(lnum-1);
			   Insert(input,lnum);
			   linen=Insert(input,lnum);       //save the new current line
			   if( linen > lnum )
				   current=linen;
			   else
				   current=lnum+1;
			   return current;
		   }		  
		   //return 0;
	   }
	   // line lnum is in tempfp[checkfile[2]-1]
	   if(ipflag==2)
	   {
		   long int sumline=signfile[0][1]+signfile[1][1]+signfile[2][1];
		   if(checkfile[1]==0)
		   {
			   fseek(tempfp[checkfile[0]-1],currentfp[checkfile[0]-1],0);
			   rewind(tempfp[checkfile[2]-1]);
			   //read memory to tempfp[checkfile[1]-1]
			   for(int i=1; i<=signfile[0][1]; i++ )
			   {
				   strp=GetLine(1);
				   fputs(strp,tempfp[checkfile[0]-1]);
				   BlockFile::DeleteLine(1);
				   delete strp;
			   }
			   //write line<lnum of tempfp[checkfile[2]-1] to tempfp[checkfile[0]-1]
			   for( i=signfile[checkfile[2]][0]; i<lnum; i++ )
			   {
				   fgets(str,128,tempfp[checkfile[2]-1]);
				   fputs(str,tempfp[checkfile[0]-1]);
			   } //find head of lnum in tempfp[checkfile[2]-1]
			   currentfp[checkfile[0]-1]=ftell(tempfp[checkfile[0]-1]);
			   //write frome lnum to lnum+(line_in_swap-1) or to end of tempfp[checkfile[2]-1] to memory
			   int j=0;			   
			   for( i=lnum; i<=sumline && j<line_in_swap; i++,j++)
			   {
				   fgets(str,128,tempfp[checkfile[2]-1]);
				   InsertLine(str,j);
			   }
			   //InsertLine(input,0);
			   if(lnum+line_in_swap<=sumline)  //there is lines left ,write to head of tempfp[checkfile[2]-1]
			   {
				   for(int i=lnum+line_in_swap; i<=sumline; i++ )
				   {
					   fgets(str,128,tempfp[checkfile[2]-1]);
					   fputs(str,tempfp[checkfile[0]-1]);
				   }
				   rewind(tempfp[checkfile[2]-1]);
				   fseek(tempfp[checkfile[0]-1],currentfp[checkfile[0]-1],0);
				   for(i=lnum+line_in_swap; i<=sumline; i++ )
				   {
					   fgets(str,128,tempfp[checkfile[0]-1]);
					   fputs(str,tempfp[checkfile[2]-1]);
				   }
				   currentfp[checkfile[2]-1]=ftell(tempfp[checkfile[2]-1]);
				   signfile[checkfile[0]][1]+=(signfile[checkfile[1]][1]+lnum-signfile[checkfile[2]][0]);
				   signfile[checkfile[1]][0]=lnum;
				   signfile[checkfile[1]][1]=GetLcnt();
				   signfile[checkfile[2]][0]=lnum+line_in_swap;
				   signfile[checkfile[2]][1]=sumline-lnum-(line_in_swap-1);
			   }
			   else
			   {
				   rewind(tempfp[checkfile[2]-1]);
				   currentfp[checkfile[2]-1]=ftell(tempfp[checkfile[2]-1]);
				   signfile[checkfile[0]][1]+=(signfile[checkfile[1]][1]+lnum-signfile[checkfile[2]][0]);
				   signfile[checkfile[1]][0]=lnum;
				   signfile[checkfile[1]][1]=GetLcnt();
				   signfile[checkfile[2]][0]=0;
				   signfile[checkfile[2]][1]=0;
			   }
			   linen=Insert(input,lnum);       //save the new current line
			   if( linen > lnum )
				   current=linen;
			   else
				   current=lnum+1;
			   return current;
		   }
		   else    //memory is the first part
		   {
			   fseek(tempfp[checkfile[1]-1],currentfp[checkfile[1]-1],0);
			   rewind(tempfp[checkfile[2]-1]);
			   //copy tempfp[checkfile[2]-1] to tempfp[checkfile[1]-1]
			   for( long int j=1; j<=signfile[checkfile[2]][1]; j++ )
			   {
				   fgets(str,128,tempfp[checkfile[2]-1]);
				   fputs(str,tempfp[checkfile[1]-1]);
			   }
			   //write momery to tempfp[checkfile[2]-1]
			   rewind(tempfp[checkfile[2]-1]);
			   for( long int i=1; i<=signfile[checkfile[0]][1]; i++ )
			   {
				   strp=GetLine(1);
				   fputs(strp,tempfp[checkfile[2]-1]);
				   BlockFile::DeleteLine(1);
				   delete strp;
			   }
			   //write line before lnum in tempfp[checkfile[1]-1] to tempfp[checkfile[2]-1]
			   rewind(tempfp[checkfile[1]-1]);
			   for(j=signfile[checkfile[1]][0]; j<lnum; j++ )
			   {
				   fgets(str,128,tempfp[checkfile[1]-1]);
				   fputs(str,tempfp[checkfile[2]-1]);
			   }//find the head pointer of line lnum in tempfp[checkfile[1]-1]
			   currentfp[checkfile[2]-1]=ftell(tempfp[checkfile[2]-1]);
			   //write the availabe line to memory
			   j=0;
			   for(i=lnum; i<=sumline && j<line_in_swap; i++,j++ )
			   {
				   fgets(str,128,tempfp[checkfile[1]-1]);
				   InsertLine(str,j);
			   }
			   //InsertLine(input,0);
			   //write the left line to head of tempfp[checkfile[1]-1]
			   if(lnum+line_in_swap<=sumline)  
			   {
				   for( long int i=lnum+line_in_swap; i<=sumline; i++ )
				   {
					   fgets(str,128,tempfp[checkfile[1]-1]);
					   fputs(str,tempfp[checkfile[2]-1]);
				   }
				   fseek(tempfp[checkfile[2]-1],currentfp[checkfile[2]-1],0);
				   rewind(tempfp[checkfile[1]-1]);
				   for( i=lnum+line_in_swap; i<=sumline; i++ )
				   {
					   fgets(str,128,tempfp[checkfile[2]-1]);
					   fputs(str,tempfp[checkfile[1]-1]);
				   }
				   currentfp[checkfile[1]-1]=ftell(tempfp[checkfile[1]-1]);
				   signfile[checkfile[0]][0]=lnum;
				   signfile[checkfile[0]][1]=GetLcnt();
				   signfile[checkfile[1]][0]=lnum+line_in_swap;
				   signfile[checkfile[1]][1]=sumline-lnum-(line_in_swap-1);
				   signfile[checkfile[2]][0]=1;
				   signfile[checkfile[2]][1]=lnum-1;
			   }
			   else
			   {
				   rewind(tempfp[checkfile[1]-1]);
				   currentfp[checkfile[1]-1]=ftell(tempfp[checkfile[1]-1]);
				   signfile[checkfile[0]][0]=lnum;
				   signfile[checkfile[0]][1]=GetLcnt();
				   signfile[checkfile[1]][0]=0;
				   signfile[checkfile[1]][1]=0;
				   signfile[checkfile[2]][0]=1;
				   signfile[checkfile[2]][1]=lnum-1;
			   }
			   checkfile[0]=checkfile[2];
			   checkfile[2]=checkfile[1];
			   checkfile[1]=0;
			   linen=Insert(input,lnum);       //save the new current line
			   if( linen > lnum )
				   current=linen;
			   else
				   current=lnum+1;
			   return current;
		   }		   
	   }//end of line lnum is in tempfp[checkfile[2]-1]	  
	   //return 0;
   }//end of insert of tempfp 
   //all is empty,insert in memory line 1
   else
   {
	   checkfile[0]=0;
	   checkfile[1]=1;
	   checkfile[2]=2;
	   signfile[0][0]=1;
	   signfile[0][1]=1;
	   signfile[1][0]=0;
	   signfile[2][0]=0;
	   Insert(input,0);
	   signfile[0][1]--;
   }   	
   return current;    
}// if right return 0; else return -1
int FileSwap::DeleteLine( long int lnum=current )
{
	int i=0,j=0;
	if(lnum>SumLNow())
	{
		return -1;  //lnum is not valid 
	}
	while(i<3)  //find part memory in which part
	{
		if(checkfile[i]==0)
			break;
		i++;
	}
	if( lnum>=signfile[0][0] && lnum<signfile[0][1]+signfile[0][0])
	{
		BlockFile::DeleteLine(lnum-signfile[0][0]+1);
		if(signfile[0][1]==1)
			signfile[0][0]=0;
		signfile[0][1]-=1;
		for(j=0;j<3;j++)
		{
			if(j>i && signfile[checkfile[j]][1]!=0)
			{
				signfile[checkfile[j]][0]-=1;
			}
		}
	}
	else
	{
		Insert("",lnum);   //to load line lnum into memory
		while(i<3)  //find part memory in which part
		{
			if(checkfile[i]==0)
				break;
			i++;
		}
		BlockFile::DeleteLine(lnum-signfile[0][0]+1);
		BlockFile::DeleteLine(lnum-signfile[0][0]+1);
		signfile[0][1]-=2;
		for( j=0; j<3; j++)//part's which is after memory first line num -2

⌨️ 快捷键说明

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