📄 blockfil.h
字号:
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
//int current=1;
//The struct of the Block
struct Block
{ char area[512]; //to save lines
char *rear; //pointe to the valid end of the block
int charcount; //sign how many charactors in the block
int linecount; //sign how many lines is the block
int endline; //the index of the line in end ofthe block
};
class BlockFile
{
private:
Block *bpointer[128];
char *lpointer[512];
int lcount; //how many lines is in memory now
int bcount; //how many blocks is in memory now
int linfor[512][3]; //linfor[i][0] sign line i in is which block, such as line lpointer[i] is in linfor[i][0]
//linfor[i][1] sign the index of the line after line i in the same block, if not, linfor[i][1]=-1
//linfor[i][2] sign the index of the line before line i in the same block, if not,linfor[i][2]=-1
void Format(Block *bp);
public:
BlockFile(void);
~BlockFile(void);
int InsertLine(char* input,int lnum);
int DeleteLine(int lnum); //return if the line is deleted correctly
int GetLcnt(void); //to get the count of the line
char* GetLine(int lnum); // get the line refered
};
BlockFile::BlockFile(void)
{
lcount=0;
bcount=1;
//BlockFile::current=0;
for( int lnum=0; lnum<512; lnum++ )
{
lpointer[lnum]=NULL;
linfor[lnum][0]=-1;
linfor[lnum][1]=-1;
linfor[lnum][2]=-1;
}
bpointer[0]=new Block;
if(bpointer[0]==NULL)
{
cout<<"Memory allocation error"<<endl;
exit(1);
}
Format(bpointer[0]);
// cout<<"c"<<endl;
}
BlockFile::~BlockFile(void)
{
int posi;
for( posi=0; posi<bcount; posi++ )
{
delete bpointer[posi];
}
for( posi=0; posi<512; posi++ )
{
lpointer[posi]=NULL;
linfor[posi][0]=-1;
linfor[posi][1]=-1;
linfor[posi][2]=-1;
}
bcount=0;
lcount=0;
// cout<<"d"<<endl;
}
void BlockFile::Format(Block *bp)
{
bp->rear=bp->area;
for(int posi=0; posi<512; posi++ )
{
bp->area[posi]='\0';
}
bp->linecount=0;
bp->charcount=0;
bp->endline=-1;
}
//Insert line input after line lnum
int BlockFile::InsertLine(char* input,int lnum)
{
int length=strlen(input);
int posi=0;
if( lnum<0||lnum>lcount )
{
return (-1);
}
if( (lcount+length/128+1)>512)
{
return (-2);
} //memory is exceeded
if(lnum>=0 && (lcount+length/128+1)<=512 )
{
if( length/128>0 )
return -1;
if( length/128==0 )
{
for( posi=lcount-1; posi >= lnum; posi-- )
{
if(lcount!=0)
{
lpointer[posi+1]=lpointer[posi];
}
}// after it, posi equal line lnum,it's value is lnum-1;
//which block is available
for(posi=0; posi<bcount; posi++)
{
if( (512-bpointer[posi]->charcount) > length+1 )
{
break;
}
}
if(posi==bcount)
{
bpointer[bcount]=new Block;
Format(bpointer[bcount]);
bcount++;
}
//block posi is available
strcpy( bpointer[posi]->rear,input );
bpointer[posi]->linecount++;
lpointer[lnum]=bpointer[posi]->rear;
//modify line information after the line insert
for(int i=lcount-1; i>=lnum; i--)
{
if(lcount!=0)
{
linfor[i+1][0]=linfor[i][0];
linfor[i+1][1]=linfor[i][1];
linfor[i+1][2]=linfor[i][2];
}
}
for( i=0; i<=lcount; i++)
{
if(linfor[i][1]>=lnum)
linfor[i][1]++;
if(linfor[i][2]>=lnum)
linfor[i][2]++;
}////
for(i=0;i<bcount;i++)
{
if(bpointer[i]->endline>=lnum)
bpointer[i]->endline++;
}
if(bpointer[posi]->endline!=-1)
{
linfor[lnum][2]=bpointer[posi]->endline;
linfor[bpointer[posi]->endline][1]=lnum;
}
else
{
linfor[lnum][2]=-1; //line lnum is the first line in the block
}
linfor[lnum][1]=-1; //sign lnum is the last line in the block
bpointer[posi]->endline=lnum;
linfor[lnum][0]=posi;
if( input[length-1]!='\n' )
{
strcat(lpointer[lnum],"\n");
bpointer[posi]->rear+=length+1;
bpointer[posi]->charcount+=length+1;
}
else
{
*(lpointer[lnum]+length)=NULL;
bpointer[posi]->rear+=length;
bpointer[posi]->charcount+=length;
}
//linfor[linfor[bpointer[posi]->endline][2]][1]=lnum-1;
lcount++;
//BlockFile::current=lnum+signfile[0][0]-1; //the array index +1
}
}
return 0;
}
//The function delete/////////////////
int BlockFile::DeleteLine(int lnum)
{
int i=0,length=0,posi;
char *temp1,*temp2;
if(lnum<1 || lnum>lcount)
{
return -1;
}
temp1=lpointer[lnum-1];
temp2=lpointer[linfor[lnum-1][1]];
if( linfor[lnum-1][1]!=-1 ) // line lnum is not the last line in the block
{
length=strlen(temp1)-strlen(temp2);
strcpy(temp1,temp2);
}
else //line lnum is the last line in the block
{
length=strlen(temp1);
}
lpointer[lnum-1]="";
posi=linfor[lnum-1][0];
int j=linfor[lnum-1][1];
//////////////////!!!!!!!!!!
while(1) //move the line after line lnum-1 in block posi forward
{
if(j!=-1)
{
lpointer[j]-=length;
if( j==bpointer[posi]->endline )
break;
j=linfor[j][1];
}
else
break;/////////////////!!!!!!!!!!!!!!or move after move pointer!!!!!!!!!!1
}
for( i=lnum-1; i<lcount-1; i++ ) //modify line pointer forward
{
lpointer[i]=lpointer[i+1];
}
bpointer[posi]->charcount-=length;
bpointer[posi]->linecount--;
bpointer[posi]->rear-=length;
*(bpointer[posi]->rear)=NULL;
/*if(bpointer[posi]->linecount!=0)
{ //block posi's endline sign the line before endline in the same block
if(bpointer[posi]->endline>lnum-1)
bpointer[posi]->endline=linfor[bpointer[posi]->endline][2];
}*/
if(bpointer[posi]->endline==lnum-1)
bpointer[posi]->endline=linfor[bpointer[posi]->endline][2];
if(linfor[lnum-1][2]!=-1)
{
linfor[linfor[lnum-1][2]][1]=linfor[lnum-1][1];
}
else
{
if(linfor[lnum-1][1]!=-1)
linfor[linfor[lnum-1][1]][2]=-1;
}
if(linfor[lnum-1][1]!=-1)
{
linfor[linfor[lnum-1][1]][2]=linfor[lnum-1][2];
}
else
{
if(linfor[lnum-1][2]!=-1)
linfor[linfor[lnum-1][2]][1]=-1;
}
for( i=lnum-1; i<lcount-1; i++ ) //modify line information
{
linfor[i][0]=linfor[i+1][0];
linfor[i][1]=linfor[i+1][1];
linfor[i][2]=linfor[i+1][2];
}
for(i=0; i<lcount-1; i++)
{
if(linfor[i][1]>lnum-1)
linfor[i][1]--;
if(linfor[i][2]>lnum-1)
linfor[i][2]--;
}
linfor[i][0]=-1;
linfor[i][1]=-1;
linfor[i][2]=-1;
for( i=0; i<bcount; i++ )
{
if( (bpointer[i]->endline >lnum-1) )
bpointer[i]->endline--;
}
lcount--;
lpointer[lcount]="";
//if a block is empty,free it,
if(bpointer[posi]->linecount==0)
{
Block *temp_bpointer=bpointer[posi];
for( i=posi; i<bcount-1; i++ )
{
bpointer[i]=bpointer[i+1];
}
bpointer[bcount-1]=temp_bpointer;
delete bpointer[bcount-1];
bcount--;
for(i=0;i<lcount;i++)
{
if(linfor[i][0]>posi)
linfor[i][0]--;
}
}
return 0;
}
/////////////////////////////////////////////////
//The function getline
//return the context with the true lnum,it means line 1 is line 1 accepted
char* BlockFile::GetLine(int lnum)
{
char str[128]="",*st;
st = new char[128];
int temp;
if(lnum<=lcount)
{
strncpy(str,lpointer[lnum-1],128);
for(temp=0;temp<128;temp++)
{
if( str[temp]=='\n' )
{
str[++temp]=NULL;
break;
}
}
strcpy(st,str);
}
return st;
}
int BlockFile::GetLcnt(void)
{
return lcount;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -