?? algo4-3.cpp
字號:
// algo4-3.cpp 文本行編輯
#include"c1.h"
#include"c4-2.h" // 采用串的堆分配存儲結構
#include"bo4-2.cpp" // 串的堆分配基本操作
#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 Replace()
{ // 替換字符串
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.顯示文件內容\n");
printf(" 3.插入行 4.刪除行 5.拷貝行 6.修改行\n");
printf(" 7.查找字符串 8.替換字符串\n");
printf(" 9.存盤退出 0.放棄編輯\n");
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: Replace();
break;
case 9: Save();
case 0: s=FALSE;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -