//行编辑主程序.cpp
#include "串的堆分配基本操作头文件.h"
#define MAX_LEN 25 //文件最大行数
#define LINE_LEN 75 //每行字符数最大值+1
#define NAME_LEN 20 //文件名最大长度(包括盘符、路径)+1
// 全局变量
HString T[MAX_LEN];
char str[LINE_LEN], filename[NAME_LEN]="";
FILE *fp;
int n=0; // 文件行数
void Open()
{// 打开文件(新或旧)
int i;
if (filename[0]) printf("已存在打开的文件\n"); // 文件已打开
else
{ printf("请输入文件名(可包括盘符、路径,不超过%d个字符): ",NAME_LEN-1);
scanf("%s%*c",filename);
fp=fopen(filename,"r");
if(fp) //已存在此文件
{do
{ fgets(str,LINE_LEN,fp);
i=strlen(str);
str[i-1]=0; //将10强制改为0
i--;
if (i>0)
{ StrAssign(&T[n],str); n++;
if (n>MAX_LEN) { printf("文件太大\n"); return; }
}
}while (i>0);
fclose(fp);
}
else printf("新文件\n");
}
}
void List()
{// 显示文件内容
int i;
for (i=0; i<n; i++) {printf("%d: ",i+1); StrPrint(T[i]); }
getchar();
}
void Insert()
{// 插入行
int i,l,m;
printf("在第l行前插m行,请输入l m: "); scanf("%d%d%*c",&l,&m);
if (n+m>MAX_LEN) {printf("插入行太多\n"); return; }
if (n>=l-1&&l>0)
{ for (i=n-1; i>=l-1; i--) T[i+m]=T[i];
n+=m;
printf("请顺序输入待插入内容:\n");
for (i=l-1; i<l-1+m; i++)
{ gets(str);
InitString(&T[i]);
StrAssign(&T[i],str);
}
}
else printf("行超出范围\n");
}
void Delete()
{// 删除行
int i,l,m;
printf("从第l行起删除m行,请输入l m: "); scanf("%d%d%*c",&l,&m);
if (n>=l+m-1&&l>0)
{ for (i=l-1+m; i<n; i++) T[i-m]=T[i];
for (i=n-m; i<n; i++) InitString(&T[i]);
n-=m;
}
else printf("行超出范围\n");
}
void Copy()
{//拷贝行
int i,l,m,k;
printf("把第l行开始的m行插在原k行之前,请输入l m k: ");
scanf("%d%d%d%*c",&l,&m,&k);
if (n+m>MAX_LEN) { printf("拷贝行太多\n"); return; }
if (n>=k-1&&n>=l-1+m&&(k>=l+m||k<=l))
{ for (i=n-1; i>=k-1; i--) T[i+m]=T[i];
n+=m;
if (k<=l) l+=m;
for (i=l-1; i<l-1+m; i++)
{ InitString(&T[i+k-l]);
StrCopy(&T[i+k-l],T[i]);
}
}
else printf("行超出范围\n");
}
void Modify()
{// 修改行
int i;
printf("请输入待修改的行号: "); scanf("%d%*c",&i);
if (i>0&&i<=n) // 行号合法
{ printf("%d: ",i); StrPrint(T[i-1]);
printf("请输入新内容: "); gets(str);
StrAssign(&T[i-1],str);
}
else printf("行号超出范围\n");
}
void Search()
{// 查找字符串
int i,k,f=1; //f为继续查找标志
char b; HString s;
printf("请输入待查找的字符串: "); scanf("%s%*c",str);
InitString(&s);
StrAssign(&s,str);
for (i=0; i<n&&f; i++) // 逐行查找
{ k=1; // 由每行第1个字符起查找
while (k)
{ k=Index(T[i],s,k); // 由本行的第k个字符开始查找
if (k) // 找到
{ printf("第%d行: ",i+1); StrPrint(T[i]);
printf("第%d个字符处找到。继续查找吗(Y/N)? ",k);
b=getchar();
getchar();
if (b!='Y'&&b!='y') { f=0; break;} //中断查找
else k++;
}
}
}
if (f) printf("没找到\n");
}
void Replace1()
{ // 替换字符串
int i,k,f=1; // f为继续替换标志
char b; HString s,t;
printf("请输入待替换的字符串: "); scanf("%s%*c",str);
InitString(&s); StrAssign(&s,str);
printf("替换为: "); scanf("%s%*c",str);
InitString(&t); StrAssign(&t,str);
for (i=0; i<n&&f; i++) //逐行查找、替换
{ k=1; // 由每行第1个字符起查找
while(k)
{ k=Index(T[i],s,k); //由本行的第k个字符开始查找
if (k) //找到
{ printf("第%d行: ",i+1);
StrPrint(T[i]);
printf("第%d个字符处找到。是否替换(Y/N)? ",k); b=getchar();
getchar();
if (b=='Y'||b=='y') { StrDelete(&T[i],k,StrLength(s));
StrInsert(&T[i],k,t); }
printf("继续替换吗(Y/N)?"); b=getchar();
getchar();
if (b!='Y'&&b!='y') { f=0; break;} //中断查找、替换
else k+=StrLength(t);
}
}
}
if (f) printf("没找到\n");
}
void Save()
{ //存盘
int i;
getchar();
fp=fopen(filename,"w");
if (fp)
{ for (i=0;i<n;i++) { T[i].ch[T[i].length]=0;
fputs(T[i].ch,fp);
fputc(10,fp);}
fputc(10,fp);
fclose(fp);
}
else printf("存盘失败\n");
}
void main()
{ Status s=TRUE;
int i,k;
for (i=0; i<MAX_LEN; i++) InitString(&T[i]); // 初始化串
while (s)
{ printf(" 1.打开文件 2.显示文件 3.插入行 4.删除行 5.拷贝行\n");
printf(" 6.修改行 7.查找串 8.替换串 9.存盘退出 0.放弃编辑\n");
printf(" 请选择:"); scanf("%d",&k);
switch(k)
{ case 1: Open();break;
case 2: List();break;
case 3: Insert();break;
case 4: Delete();break;
case 5: Copy(); break;
case 6: Modify(); break;
case 7: Search(); break;
case 8: Replace1(); break;
case 9: Save();
case 0: s=FALSE;
}
}
}