textedit.cpp

来自「数据结构课程设计 图形界面 数据结构课程设计 图形界面 文本编辑器用MFC做」· C++ 代码 · 共 403 行

CPP
403
字号
//textedit.cpp// algo4-3.cpp 文本行编辑
#include"StdAfx.h"
#include "kecheng.h"
#include "openDlg.h"
#include "InsertDlg.h"
#include "InsertInforDlg.h"
#include "DeleteDlg.h"
#include "CopyDlg.h"
#include "ModifyDlg.h"
#include "ModifyInforDlg.h"
#include "SearchDlg.h"
#include "ReplaceDlg.h"


#include "windows.h"
#include"textedit.h"
#include"c1.h"
#include"c4_2.h" // 采用串的堆分配存储结构
//#include"bo4_2.cpp" // 串的堆分配基本操作


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define MAX_LEN 200 // 文件最大行数
#define LINE_LEN 200 // 每行字符数最大值+1
#define NAME_LEN 50 // 文件名最大长度(包括盘符、路径)+1

// 全局变量
HString T[MAX_LEN];
char str[LINE_LEN],strr[LINE_LEN],filename[NAME_LEN]="";
FILE *fp;
int n=0; // 文件行数
HWND hWnd;

void Open()
{ // 打开文件(新或旧)
	int i;
	if(filename[0]) // 文件已打开
		MessageBox(hWnd,"已存在打开的文件\n","提示",MB_OK|MB_ICONINFORMATION );
	else
	{
		//printf("请输入文件名(可包括盘符、路径,不超过%d个字符): ",NAME_LEN-1);
		//scanf("%s%*c",filename);
		CopenDlg dlg;

		if(IDOK==dlg.DoModal())
		{
			//filename=dlg.m_filename;
			strcpy((char*)filename,dlg.m_filename.GetBuffer(0));//strcpy拷贝字符串,遇到'\0'就结束拷贝;
		}
		else return;//取消操作 返回void值
		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");
						MessageBox(hWnd,"文件太大\n","提示",MB_OK|MB_ICONEXCLAMATION );
						return;
					}
				}
			}while(i>0);
			fclose(fp);
		}
		else
			//printf("新文件\n");
			MessageBox(hWnd,"新文件\n","提示",MB_OK|MB_ICONEXCLAMATION );
	}
}

char* List()
{ // 显示文件内容
	int i;
	CString strT,strS;
	for(i=0;i<n;i++)
	{  
		strT.Format("%d:%s",i+1,T[i].ch);//格式化函数1 strT.Format("%d:%s",i+1,T[i].ch);
	//printf("%d: ",i+1);		//函数2为sprintf(tempf,"%s说:%s",chara,charb);其中tempf[80],chara[10],charb[10]为char
	//StrPrint(T[i]);
		strS+=strT;
		strS+="\r\n";
	}
	getchar();
	char str1[32678];
	strcpy(str1,strS.GetBuffer(0));
	return str1;
}

void Insert()
{ // 插入行
	int i,l,m;
	CInsertDlg dlg;
	//printf("在第l行前插m行,请输入l m: ");
	//scanf("%d%d%*c",&l,&m);
	if(IDOK==dlg.DoModal())
	{
		l=dlg.m_insertl;
		m=dlg.m_insertm;
	}
	if(n+m>MAX_LEN)
	{
		//printf("插入行太多\n");
		MessageBox(hWnd,"插入行太多\n","提示",MB_OK|MB_ICONEXCLAMATION );
		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++)
		{
			CInsertInforDlg indlg;
			//gets(str);
			if(IDOK==indlg.DoModal())
			{
				strcpy(str,indlg.m_insertinfor.GetBuffer(0));
			}
			InitString(T[i]);
			StrAssign(T[i],str);
		}
	}
	else
		//printf("行超出范围\n");
		MessageBox(hWnd,"行超出范围\n","提示",MB_OK|MB_ICONEXCLAMATION );
}

void Delete()
{ // 删除行
	int i,l,m;
	CDeleteDlg dlg;
	//printf("从第l行起删除m行,请输入l m: ");
	//scanf("%d%d%*c",&l,&m);
	if(IDOK==dlg.DoModal())
	{
		l=dlg.m_deletel;
		m=dlg.m_deletem;
	}
	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");
		MessageBox(hWnd,"行超出范围\n","提示",MB_OK|MB_ICONEXCLAMATION );
}

void Copy()
{ // 拷贝行
	int i,l,m,k;
	//printf("把第l行开始的m行插在原k行之前,请输入l m k: ");
	//scanf("%d%d%d%*c",&l,&m,&k);
	CCopyDlg dlg;
	if(IDOK==dlg.DoModal())
	{
		l=dlg.m_copyl;
		m=dlg.m_copym;
		k=dlg.m_copyk;
	}
	else return;
	if(n+m>MAX_LEN)
	{
		//printf("拷贝行太多\n");
		MessageBox(hWnd,"拷贝行太多\n","提示",MB_OK|MB_ICONEXCLAMATION );
		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");
		MessageBox(hWnd,"行超出范围\n","提示",MB_OK|MB_ICONEXCLAMATION );
}

void Modify()
{ // 修改行
	int i;
	//printf("请输入待修改的行号: ");
	//scanf("%d%*c",&i);
	CModifyDlg dlg;
	if(IDOK==dlg.DoModal())
	{
		i=dlg.m_modifyi;
	}
	if(i>0&&i<=n) // 行号合法
	{
		//printf("%d: ",i);
		//StrPrint(T[i-1]);
		CString str2;
		str2.Format("%d:%s\n",i,T[i-1]);
		MessageBox(hWnd,str2,"修改",MB_OK);
		//printf("请输入新内容: ");
		//gets(str);
		CModifyInforDlg indlg;
		if(IDOK==indlg.DoModal())
		{
			strcpy(str,indlg.m_modifyinfor.GetBuffer(0));
		}
		StrAssign(T[i-1],str);
	}
	else
		//printf("行号超出范围\n");
		MessageBox(hWnd,"行号超出范围\n","提示",MB_OK);
}

void Search()
{ // 查找字符串
	int i,k,f=1,count=0; // f为继续查找标志
	//char b;
	HString s;
	//printf("请输入待查找的字符串: ");
	//scanf("%s%*c",str);
	CSearchDlg dlg;
	if(IDOK==dlg.DoModal())
	{
		strcpy(str,dlg.m_search.GetBuffer(0));
	}
	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) // 找到
			{
				count++;
				//printf("第%d行: ",i+1);
				//StrPrint(T[i]);
				//printf("第%d个字符处找到。继续查找吗(Y/N)? ",k);
				CString strS;
				strS.Format("第%d行: %s\n第%d个字符处找到。继续查找吗(Y/N)? ",i+1,T[i].ch,k);
				if(IDNO==MessageBox(hWnd,strS,"提示",MB_YESNO|MB_ICONQUESTION ))
				{
					f=0;
					break;
				}
				else
					k++;
			}
		}
	}
	if(f)
		//printf("没找到\n");
		MessageBox(hWnd,"没找到\n","提示",MB_OK|MB_ICONEXCLAMATION );
	CString strT;
	strT.Format("共找到 %d个\n",count);
	strT+=dlg.m_search;
	MessageBox(hWnd,strT,"查找结果",MB_OK|MB_ICONEXCLAMATION );
}

void Replace()
{ // 替换字符串
	int i,k,f=1,count=0; // f为继续替换标志
	//char b;
	HString s,t;
	CReplaceDlg dlg;
	// printf("请输入待替换的字符串: ");
	//scanf("%s%*c",str);
	if(dlg.DoModal()==IDOK)
	{
		strcpy(str,dlg.m_replacey.GetBuffer(0));
		strcpy(strr,dlg.m_replaceh.GetBuffer(0));
	}
	InitString(s);
	StrAssign(s,str);
	//printf("替换为: ");
	//scanf("%s%*c",str);
	InitString(t);
	StrAssign(t,strr);
	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);
				count++;
				CString strS;
				strS.Format("第%d行: %s\n第%d个字符处找到。是否替换(Y/N)? ",i+1,T[i].ch,k);
				if(IDYES==MessageBox(hWnd,strS,"提示",MB_YESNO|MB_ICONQUESTION ))
				//b=getchar();
				//getchar();
				//if(b=='Y'||b=='y')
				{
					StrDelete(T[i],k,StrLength(s));
					StrInsert(T[i],k,t);
				}
				//printf("继续替换吗(Y/N)?");
				if(IDNO==MessageBox(hWnd,"继续替换吗(Y/N)?\n","提示",MB_YESNO|MB_ICONQUESTION ))
				//b=getchar();
				//getchar();
				//if(b!='Y'&&b!='y') // 中断查找、替换
				{
					f=0;
					break;
				}
				else
					k+=StrLength(t);
			}
		}
	}
	if(f)
		//printf("没找到\n");
		MessageBox(hWnd,"没找到\n","提示",MB_OK);
	CString strT;
	strT.Format("共替换 %d个\n",count);
	strT+=dlg.m_replacey;
	MessageBox(hWnd,strT,"替换结果",MB_OK|MB_ICONEXCLAMATION );
}

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");
		MessageBox(hWnd,"存盘失败\n","提示",MB_OK|MB_ICONINFORMATION);   
}
/*
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 + =
减小字号Ctrl + -
显示快捷键?