📄 fileswap.h
字号:
{
//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 + -