?? wenbenbianji.c
字號:
#include<stdio.h>
#include<stdlib.h>
// 文本編輯器 每行80字,每頁20行,每個活區5頁
typedef struct{
char *address; //每行在文本數組中的起始地址
int length; //行的長度
}line; //行表的元素項
typedef struct{
int number; //每活區相對文件頭的起始字符號
int flag; //該活區是否被改動,將決定活區表對應的文件
int howmany; //該活區有多少字符
}page; //活區的元素項
char text[8000];
char in[20];
char out[20];
// 全局變量
bool initlinetable(char in[],page chart[],int &pages)
// 讀入文本文件,產生活區表
// 帶回活區數變量
{ FILE *fp;
int i,j,k;
i=j=k=0;
char temp;
int f;
if((fp=fopen(in,"r"))==NULL)
{
printf(" 不能打開輸入文件 \n");
exit(0); }
chart[0].number=0;
chart[0].flag=0;
k++;
while(!feof(fp))
{ fscanf(fp,"%c",&temp);
i++;
if(temp=='\n') { j++; f=0;}
else f=1;
if(f==0&&j%100==0)
{ chart[k].number=i; chart[k].flag=0; k++; }
}
fclose(fp);
pages=k;
for(k=0;k<pages-1;k++)
chart[k].howmany=chart[k+1].number-chart[k].number;
chart[k].howmany=i-chart[k].number;
printf("文件讀入完成\n");
return true; }
bool linetableset(line table[],int &tablelength)
// 將文本數組里的內容映象為行表,帶回行數
{
int i,j,k;
i=j=k=0;
for(i=0; text[i]!='\0';i++)
{ table[j].address=&text[i];
k=1;
while(text[i]!='\n'&&text[i]!='\0')
{ k++; i++; }
table[j].length=k;
if(text[i]=='\0') break;
j++;
}
tablelength=j;
printf("行表設置完成\n");
return true;
}
bool insertline(char out[],line table[],page chart[],int serial,int whichrow,int &tablelength)
// 在當前活區內插入行,將活區表對應的映象的改動標志位置1
// 對活區內行表進行插入操作
// 當活區滿時,再插入后產生活區下移, 最上一行寫入文件
// 活區號和行號為范圍值
{ FILE *fp;
int i, j;
i=j=0;
line temp;
char key;
if((fp=fopen(out,"r"))==NULL)
{
printf(" 不能打開輸出文件 \n");
exit(0); }
while(!feof(fp))
{ fscanf(fp,"%c",&key); i++;}
fclose(fp);
chart[serial-1].number=i-1;
chart[serial-1].flag=1;
for(j=tablelength-1; j>=whichrow; j--)
{ table[j+1] =table[j] ;
}
temp.address=(char *)malloc(80*sizeof(char));
i=0;
while(key!='\n')
{ key=getchar();
temp.address[i]=key;
i++; }
temp.address[i]='\n';
temp.length=i;
table[whichrow]=temp;
tablelength++;
chart[serial-1].howmany=chart[serial-1].howmany+i;
if(tablelength>100)
{ if((fp=fopen(out,"a+"))==NULL)
{ printf("活區溢出,文件追加錯誤"); exit(0); }
for(i=0;i<table[0].length;i++)
fprintf(fp,"%c",table[0].address[i]);
for(i=0;i<100;i++)
table[i]=table[i+1];
tablelength--;
printf("活區滿,活區整體下移一行\n");
fclose(fp);
}
printf("行插入完成\n");
return true;
}
bool activepagevary(page chart[],int &tablelength,line table[], int oldpage, int newpage)
// 活區的初始化及切換,將原活區按行表寫入數組,將新活區按活區表掉入文本數組
{ FILE *fp;
int i,j;
char temp;
char name[20];
if(oldpage!=0)
if(chart[oldpage-1].flag==1)
{ fp=fopen(out,"a+");
for(i=0;i<tablelength;i++)
for(j=0;j<table[i].length;j++)
fprintf(fp,"%c",table[i].address[j]);
fclose(fp);
}
if(chart[newpage-1].flag==0)
for(i=0;i<20;i++) name[i]=in[i];
else
for(i=0;i<20;i++) name[i]=out[i];
if((fp=fopen(name,"r"))==NULL)
{ printf(" 不能打開文件 \n"); exit(0); }
for(i=0;i<chart[newpage-1].number-1;i++)
fscanf(fp,"%c",&temp);
//fseek(fp,chart[newpage-1].number*sizeof(char),0);
i=0;
while(i<chart[newpage-1].howmany)
{ fscanf(fp,"%c",&text[i]);
i++; }
text[i]='\0';
fclose(fp);
printf("活區設置完成\n");
return true;}
bool linedelete(line table[],int &tablelength,int whichrow)
// 在行表上刪除一行
{ int j;
for(j=whichrow-1;j<tablelength;j++)
table[j]=table[j+1];
tablelength--;
printf("行刪除完成\n");
return true;}
bool displayline(line table[],int length)
{
int pag[5];
int i,j,k;
i=j=k=0;
int key;
char *letterpointer;
char *linepointer;
for(i=0;i<5;i++)
pag[i]=20*i;
while(key!=0)
{ printf("該活區共%d頁,請選擇頁號",length/20);
scanf("%d",&key);
for(i=pag[key-1]; i<pag[key]&&i<length; i++)
{ linepointer=table[i].address;
printf("%d ",i+1);
for(k=0;k<table[i].length;k++)
{ letterpointer=linepointer+k*sizeof(char);
printf("%c",*letterpointer);
}
}
}
return true;
}
main()
{ page pagechart[10];
line linetable[101];
int linelength;
int pages;
char key;
int choose;
int current;
int row;
int derow;
choose=0;
printf("輸入文件名:");
scanf("%s",in);
printf("輸出文件名");
scanf("%s",out);
initlinetable(in,pagechart,pages);
printf("共有%d個活區",pages);
printf("請選擇活區");
while(choose<1||choose>pages)
scanf("%d",&choose);
activepagevary(pagechart,linelength,linetable,0,choose);
current=choose;
linetableset(linetable,linelength);
do{
printf("輸入命令: i---行插入, d---行刪除, c---活區切換 p---活區顯示, q---退出程序\n");
printf("您的選擇是:");key=getchar();
switch(key) {
case 'i': printf("共%d行,想插入到第幾行下",linelength);
row=-1;
while(row<0||row>linelength) scanf("%d",&row);
insertline(out,linetable,pagechart,current,row,linelength) ;
break;
case 'd': printf("共%d行,想刪除第幾行",linelength);
derow=0;
while(derow<1||derow>linelength) scanf("%d",&derow);
linedelete(linetable,linelength,derow) ;
break;
case 'p': displayline(linetable,linelength) ;
break;
case 'c': printf("共有%d個活區",pages);
printf("請選擇活區");
choose=0;
while(choose<1||choose>pages)
scanf("%d",&choose);
activepagevary(pagechart,linelength,linetable,current,choose);
current=choose;
linetableset(linetable,linelength);
break;
case 'q': exit(0); }
}while(1);
return true;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -