c 简易文本编辑器 t t

合集下载

用C#创建一个简单的文本编辑器

用C#创建一个简单的文本编辑器

用C#创建一个简单的文本编辑器学习用C#创建一个简单的文本编辑器——Shawn&Cheney Editor。

1.创建一个工程,命名为SimpleEditor2.把生成的文件Form1.cs重命名为SimpleEditorForm3.设置窗体属性:Text:Shawn&Cheney EditorIcon:选择一个自定义图标4.给窗体添加一个菜单栏和一个richTextBox控件设置richTextBox控件属性如下5.给菜单项添加“新建”、“打开”、“保存”、“另存为”项目,分别设置好各自属性。

6.首先在SimpleEditorForm类中定义一个成员变量filename,用来接收文件public partial class SimpleEditorForm : Form{private string filename = "Untitled";…………}7.修改SimpleEditorForm构造函数,使其接收一个文件名参数public SimpleEditorForm(string filename){InitializeComponent();if (filename != null){this.filename = filename;OpenFile();}//如果接收到一个不为null的参数,就给前面定义的成员变量filename赋值//然后调用OpenFile函数,这个函数接下来将会给出定义。

}8.修改Program.cs中的main函数,使得main()可以给SimpleEditorForm传递filename参数static void Main(string[] args){string filename = null;if (args.Length != 0)filename = args[0];Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new SimpleEditorForm(filename));}//如果本程序执行时带有参数(即给定了文件名),则这里会把这个文件名传递给SimpleEditorForm//否则,将传递一个空值9.给出OpenFile()方法的实现,将OpenFile()作为SimpleEditorForm的成员函数public partial class SimpleEditorForm : Form{………………protected void OpenFile(){try{TextBoxEdit.Clear();TextBoxEdit.Text = File.ReadAllT ext(filename);}catch (IOException ex){MessageBox.Show(ex.Message, "Simple Editor",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);}}………………}由于这里使用了File类,所以必须添加using System.IO命名空间10.给菜单项“新建”添加处理程序private void MenuItemNew_Click(object sender, EventArgs e) {filename = "Untitled"; //新建的文件文件名应该是UntitledTextBoxEdit.Clear(); //调用Clear()方法清空文本框}现在,已经可以通过这个程序来打开文件了要给应用程序添加命令行参数,可以通过下面的方法:在Solution Explorer中右击项目,点击“属性”,点击“调试”,输入命令行参数本例中输入F:\CSharpPro\my6thPro\SimpleEditor\SimpleEditor\SimpleEdito rForm.cs运行程序,可以看到文件已经被打开了下面我们接着说如何实现“打开”、“保存”、“另存为”菜单项的功能。

C++课程设计简易文本编辑器

C++课程设计简易文本编辑器

目录第一章课程设计目的和要求 (1)1.1课程设计的目 (1)1.2基本要求 (1)第二章课程设计任务内容 (2)2.1设计背景 (2)2.2简易文本编辑器设计内容 (2)第三章详细设计 (3)3.1总体结构图 (3)3.2函数分析 (3)3.3主函数程序流程图 (4)3.4子函数流程图 (5)第四章程序编码与调试 (7)4.1程序编码 (7)4.2编码调试 (8)4.3运行结果 (9)第五章课程设计心得与体会 (11)附录1 参考文献 (12)附录2 源程序代码 (13)第一章课程设计目的和要求C语言课程设计是一门实践性非常强的课程,不但要注重c语言程序设计基本知识的学习,更要注重程序设计技能的培养,使学生能够允许渐进地把握c语言程序设计的技能。

通过课程设计,培养学生阅读和编写程序的能力,培养计算机程序设计的能力和素质,以及思维方法。

初步积累编程经验,打下良好的计算机应用基础。

1.1课程设计的目1.通过本项课程设计,可以培养独立思考、综合运用所学有关相应知识的能力,能更好的巩固《c语言程序设计》课程学习的内容2.掌握工程软件设计的基本方法,强化上级动手编程能力,闯过理论与实践相结合的难关!更加了解了c语言的好处和其可用性。

3.掌握基本的程序设计过程和技巧,掌握基本的分析问题合理性,通过计算机求解问题的能力,具备初步的高级语言程设计能力。

为后续个门计算机课程的学习和毕业设计打下结实基础。

4.通过c语言课程设计,使学生了解高级程序设计语言的结构。

1.2 基本要求1.基本要求:①要求用VC中的MFC控件打开和保存文件。

②要求在设计的程序中至少能完成六种编辑功能。

③完成的程序界面要美观,能够完成六种编辑的全过程。

2.创新要求:①在记事本中增加工具栏,工具栏中应有常使用的工具按钮;②在记事本中增加状态栏;第二章课程设计任务内容2.1 设计背景随着计算机在社会生活深红越来越深入而广泛的应用,在文件中有些文件需要改动,比如插入,替换,删除等一系列操作,为了更好的修改文件,不得不进行一系列的操作来修改,因此,文件的修改操作是十分重要的。

QT实现文本编辑器

QT实现文本编辑器

QT实现⽂本编辑器⼀⽤Qt4实现的⽂本编辑器1. 新建,打开,保存⽂件2.基本的⽂本编辑功能(复制,粘贴,剪切等)3.不同风格4.改变⽂字的⼤⼩,颜⾊,字体等界⾯如下:⼆⼯程⽂件1. /* src.pro*/TEMPLATE = appCONFIG += warn_on \thread \qt \qtestlibTARGET = texteditorDESTDIR = ../binSOURCES += CMainWindow.cpp \ MainWindow.cpp \CFindDialog.cppui_finddialog.h \ui_MainWindow.hFORMS += FindDialog.ui \MainWindow.uiRESOURCES += MainWindow.qrcQT += qt3support2. /*CMainWindow.cpp*/#include "CMainWindow.h"#include "CFindDialog.h"#include#includeCMainWindow::CMainWindow(QWidget *parent): QMainWindow(parent){setupUi(this);iniStatusBar();iniConnect();fontColorAct = new QAction(QPixmap(32, 32), tr("改变字体颜⾊"), this); styleToolBar = new QToolBar(this);styleToolBar->setObjectName(QString::fromUtf8("styleToolBar")); styleToolBar->setOrientation(Qt::Horizontal);this->addToolBar(Qt::TopToolBarArea, styleToolBar);menu_2->addAction(fontColorAct);styleToolBar->addAction(fontColorAct);show();connect(fontColorAct, SIGNAL(triggered()), this, SLOT(changeColor())); } void CMainWindow::iniConnect(){connect(textEdit, SIGNAL(cursorPositionChanged()),this, SLOT(doCursorChanged()));connect(textEdit->document(), SIGNAL(contentsChanged()),this, SLOT(doModified()));connect(actionAbout, SIGNAL(triggered()), this, SLOT(doAbout())); connect(actionHelp, SIGNAL(triggered()), this, SLOT(doHelp()));connect(actionOpen, SIGNAL(triggered()), this, SLOT(doOpen())); connect(actionAll, SIGNAL(triggered()), this, SLOT(doAll()));connect(actionASave, SIGNAL(triggered()), this, SLOT(doASave())); connect(actionClose, SIGNAL(triggered()), this, SLOT(doClose())); connect(actionCopy, SIGNAL(triggered()), this, SLOT(doCopy())); connect(actionUndo, SIGNAL(triggered()), this, SLOT(doUndo())); connect(actionRedo, SIGNAL(triggered()), this, SLOT(doRedo())); connect(actionSave, SIGNAL(triggered()), this, SLOT(doSave())); connect(actionFind, SIGNAL(triggered()), this, SLOT(doFind())); connect(actionNew, SIGNAL(triggered()), this, SLOT(do New())); connect(actionPaste, SIGNAL(triggered()), this, SLOT(doPaste())); connect(actionCut, SIGNAL(triggered()), this, SLOT(doCut()));connect(actionWindows, SIGNAL(triggered()), this, SLOT(doWindows())); connect(actionWindowsXp, SIGNAL(triggered()), this,SLOT(doWindowsXp()));connect(actionCDE, SIGNAL(triggered()), this, SLOT(doCDE())); connect(actionMotif, SIGNAL(triggered()), this, SLOT(doMotif())); connect(actionPlastique, SIGNAL(triggered()), this, SLOT(doPlastique())); connect(actionFont, SIGNAL(triggered()), this, SLOT(doFont()));}void CMainWindow::changeColor(){QColor color =QColorDialog::getColor(fontColor, this);if(color.isValid()) {fontColor = color;updateColor();}textEdit->setTextColor(fontColor);}void CMainWindow::doModified(){setWindowModified(textEdit->document()->isModified());label2->setText("正在修改");}{QMessageBox::about(this,"关于","TextEditor 1.0\nBy Roc\nJune-15th-2009"); } void CMainWindow::doHelp(){QString info;QFile file("help.txt");if (!file.open(QFile::ReadOnly | QFile::Text)) {QMessageBox::warning(this,"打开帮助⽂档",QString("⽆法读取帮助⽂件:\n%1").arg(file.errorString()));return ;}else{QTextStream in(&file);QMessageBox box(this);box.setWindowTitle("帮助");box.setIcon(QMessageBox::Information); box.setText("TextEditor简介:");box.setStandardButtons(QMessageBox::Ok); box.setDetailedText(in.readAll());box.exec();return ;}}void CMainWindow::iniStatusBar()label1 = new QLabel;label1->setMinimumSize(200, 25);label1->setFrameShadow(QFrame::Sunken); label1->setFrameShape(QFrame::WinPanel);label2->setMinimumSize(200, 25);label2->setFrameShadow(QFrame::Sunken); label2->setFrameShape(QFrame::WinPanel); statusbar->addWidget(label1);statusbar->addWidget(label2);}void CMainWindow::doASave(){QString filename =QFileDialog::getSaveFileName(this,"另存为", currentFile, "text files *.txt");if (!filename.isEmpty()){saveFile(filename);}}void CMainWindow::doCut(){textEdit->cut();}void CMainWindow::doCopy(){textEdit->copy();}void CMainWindow::doClose(){maybeSave();textEdit->setVisible(false);void CMainWindow::doNew(){maybeSave();isUntited = true;currentFile = "Untited";setWindowTitle(currentFile + "[*]");textEdit->setVisible(true);setWindowModified(false);}void CMainWindow::doOpen(){QString fileName = QFileDialog::getOpenFileName(this, "打开⽂本", QDir::currentPath(), "text files *.txt"); if (!fileName.isEmpty()){maybeSave();if (loadFile(fileName)){label2->setText("已读取");}}textEdit->setVisible(true);}void CMainWindow::doUndo(){textEdit->undo();}void CMainWindow::doRedo(){textEdit->redo();}void CMainWindow::doPaste(){textEdit->paste();}void CMainWindow::doAll(){textEdit->selectAll();}void CMainWindow::doSave(){{doASave();}else{saveFile(currentFile);}}void CMainWindow::doFind(){CFindDialog *finddlg = new CFindDialog(0);finddlg->bolding(textEdit);finddlg->show();}void CMainWindow::doQuit(){doClose();delete textEdit;textEdit = NULL;qApp->quit();}bool CMainWindow::loadFile(const QString &fileName) {QFile file(fileName);if (!file.open(QFile::ReadOnly | QFile::Text)){QMessageBox::warning(this,"读取⽂件",QString("⽆法读取⽂件%1:\n%2").arg(fileName).arg(file.errorString()));return false;}elseQTextStream in(&file);QApplication::setOverrideCursor(Qt::WaitCursor);textEdit->setText(in.readAll());QApplication::restoreOverrideCursor();setCurrentFile(fileName);return true;}}void CMainWindow::setCurrentFile(const QString &fileName) { currentFile = QFileInfo(fileName).canonicalFilePath(); isUntited = false;setWindowTitle(currentFile + "[*]");textEdit->document()->setModified(false); setWindowModified(false);}bool CMainWindow::saveFile(const QString fileName){QFile file(fileName);if (!file.open(QFile::WriteOnly | QFile::Text)){QMessageBox::warning(this,"保存⽂件",QString("⽆法保存⽂件%1:\n%2").arg(fileName).arg(file.errorString()));return false;}QTextStream out(&file);QApplication::setOverrideCursor(Qt::WaitCursor);out<toPlainText();QApplication::restoreOverrideCursor();setCurrentFile(fileName);label2->setText("已保存");return true;void CMainWindow::doWindows(){qApp->setStyle("windows");}void CMainWindow::doWindowsXp(){qApp->setStyle("windowsxp");}void CMainWindow::doMotif(){qApp->setStyle("motif");}void CMainWindow::doCDE(){qApp->setStyle("cde");}void CMainWindow::doPlastique(){qApp->setStyle("plastique");}void CMainWindow::doFont(){bool ok;QFont font = QFontDialog::getFont(&ok,textEdit->font(),this,"字体对话框"); if (ok){textEdit->setFont(font);}}void CMainWindow::maybeSave(){if (textEdit->document()->isModified()){QMessageBox box;box.setIcon(QMessageBox::Warning);box.setText("⽂档未保存,是否保存?");box.setStandardButtons(QMessageBox::Yes | QMessageBox::No);if (box.exec() == QMessageBox::Yes){doSave();}}}void CMainWindow::doCursorChanged(){int pageNum = textEdit->document()->pageCount();const QTextCursor cursor = textEdit->textCursor();int colNum = cursor.columnNumber();int rowNum = textEdit->document()->blockCount();label1->setText(QString("%1页%2⾏%3列").arg(pageNum).arg(rowNum).arg(colNum));}void CMainWindow::updateColor(){QPixmap pixmap(32, 32);QPainter painter(&pixmap);painter.fillRect(0, 0, 32, 32, fontColor);QColor lighter = fontColor.light();painter.setPen(lighter);QPoint lightFrame[] = {QPoint(0, 31), QPoint(0, 0), QPoint(31, 0) }; painter.drawPolyline(lightFrame, 3); painter.setPen(fontColor.dark());QPoint darkFrame[] = {QPoint(1, 31), QPoint(31, 31), QPoint(31, 1) }; painter.drawPolyline(darkFrame, 3); painter.end();fontColorAct->setIcon(pixmap);}。

C语言实现文本编辑器

C语言实现文本编辑器

C语言实现文本编辑器本文将介绍使用C语言实现一个简单的文本编辑器的基本原理和实现步骤。

通过此编辑器,用户可以打开、编辑、保存和关闭文本文件,并且具备基本的文本编辑功能,如插入、删除、查找和替换文本等。

一、编辑器界面设计为了实现一个简单易用的文本编辑器,我们可以设计一个基于命令行界面的编辑器。

用户可以通过文本命令来操作编辑器,从而实现基本的编辑功能。

二、文件的打开和保存在C语言中,我们可以使用标准文件操作函数来实现文件的打开和保存。

用户可以通过指定文件路径来打开或保存文件。

打开文件时,程序会读取文件内容,并将其显示在编辑器界面中;保存文件时,程序会将编辑器内的文本内容写入目标文件中。

三、基本文本编辑功能1. 插入文本用户可以使用插入命令将文本内容插入到当前光标位置之前或之后。

程序会根据插入位置的不同,调整光标的位置,并显示插入后的文本内容。

2. 删除文本用户可以使用删除命令删除当前光标位置处的文本内容。

程序会删除光标所在位置的字符,并相应地调整文本的显示和光标的位置。

3. 搜索文本用户可以使用搜索命令来查找特定的文本内容。

程序会从当前光标位置开始搜索,并根据搜索结果将光标移动到匹配文本的位置。

4. 替换文本用户可以使用替换命令将指定的文本内容替换为新的内容。

程序会搜索文本中的所有匹配项,并将其替换为新的内容。

四、其他功能扩展除了基本的文本编辑功能外,我们还可以对编辑器进行功能扩展,以提升用户体验和编辑效率。

一些可能的扩展功能包括:1. 撤销和重做功能:允许用户撤销和重做操作,以便回退或恢复文本编辑的历史记录。

2. 多窗口编辑:支持同时打开和编辑多个文本文件的功能,提供多窗口切换和管理。

3. 自动保存与恢复:定时自动保存编辑的文本内容,并在下次启动时自动恢复上次编辑的状态。

4. 语法高亮:根据文本类型,对关键字、注释、字符串等进行特殊标记显示,提升代码可读性。

五、总结通过使用C语言,我们可以实现一个简单但功能完善的文本编辑器。

简易文本编辑器

简易文本编辑器

数据结构课程设计简易文本编辑器系别电子信息系专业计算机科学与技术班级学号姓名指导教师成绩2011 年1月15日1需求分析一个简易文本编辑器应该具有图形菜单界面,包括查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除文本信息等功能并可正确存盘、取盘,正确显示总行数。

2概要设计为实现数据的有序存储,该编辑器应该用顺序表来存储输入的信息。

顺序表是数据结构中线性表的一种,它是用一块地址连续的存储空间依次存储线性表的元素。

其特点为:在顺序表上逻辑关系相邻的俩个元素在物理位置上也相邻;在顺序表上可以随即存取表中的元素。

在编辑器的主界面中应有如下提示信息:⑴清空以前的文本信息:将用数组存的数据内容全部置为0;⑵显示当前文本信息:遍历用数组存入的信息,并输入到外部显示器上;⑶编辑信息:定义一个结构体,并在结构体中定义一个字符型的一维数组和一个整型变量,这个整型变量用于记录一维数组中存入数据的个数;⑷替换文本信息:首先在数组中查找要被替换的信息,如果找到该信息,提示输入要替换的信息内容,否则提示未找到要被替换的信息;⑸插入文本信息:首先在数组中查找要插入点,如果找到该插入点,提示输入插入信息,确认插入信息后,提示选择向前插入信息还是向后插入信息,如果未找到插入点,显示未找到要插入的位置;⑹移动文本信息:首先在数组中查找要移动的信息,如果找到该信息,提示是进行列移动还是进行行移动,否则提示未找到要移动的信息;⑺删除文本信息:首先在数组中查找要删除的信息,如果找到该信息,提示是否确认删除该信息,通过确认来删除信息,如果未找到要删除的信息,提示未找到该信息;⑻退出编辑器:显示感谢使用该软件并退出。

文本编辑器的运行流程图,如图2—1所示。

图2—1文本编辑器流程图3详细设计#include <stdio.h>#include <stdlib.h>#include <string.h>#include <malloc.h>#include <time.h>#define MAXSIZE 100int ntext; //全局变量int b=0;typedef struct{char sr[MAXSIZE];int hang;int lie;}shuru ;int strindex(shuru m,char t[],int i2,int l) //查找要操作的数据的位置(模式匹配) {int i4=l,j=0;while (i4<ntext&&j<i2){if (m.sr[i4]==t[j]) //继续匹配下一个字符{j++;i4++;//主串和子串依次匹配下一个字符}else //主串、子串指针回溯重新开始下一次匹配{i4=i4-j+1; //主串从下一个位置开始匹配j=0;//子串从头开始匹配}}if (j>=i2){return(i4-i2);} //返回匹配的第一个字符的下标elsereturn(-1); //模式匹配不成功}void charu(shuru &k,int l) //向文本中插入内容{system("cls");int i,t=0,t2=0,a=-1;char cr[20],pd,x[500],c,d;int i2;printf("\n当前文本信息为:\n");for (i2=0;i2<=ntext-1;i2++)printf("%c",k.sr[i2]);printf("\n输入您要在哪个内容前插入,以@结束:");fflush(stdin);while ((c=getchar())!='@') //用一个数组接收要插入在哪个内容之前{if (c=='@'){break;}else{cr[t]=c;t++;continue;}}a=strindex(k,cr,t,l); //查找并返回要插入的位置点if (a!=-1){l=a+t;}int hs=1,ls=0;for (b=0;b<a;b++){ls++;if (k.sr[b]=='\n'){hs++;ls=0;}}if (a==-1){printf("\n查找到结尾没有找到插入点\nR:重新查找点\n双击回车键返回菜单:\n");l=0;fflush(stdin);d=getchar();fflush(stdin);}else{int i2;printf("\n当前文本信息为:\n");for (i2=0;i2<=ntext-1;i2++)printf("%c",k.sr[i2]);printf("\n您要插入的位置是第%d行,第%d列之前\nA:不是此位置向后继续找插入点\nB:在此位置插入\nR:重新查找点\n双击回车键:返回菜单重新插入\n请选择:",hs,ls+1);fflush(stdin);pd=getchar();}if (pd=='a'||pd=='A'){l=a+t;charu(k,l);}else if (pd=='b'||pd=='B'){printf("\n\n输入您要插入的内容:");fflush(stdin);while ((c=getchar())!='@'){if (c=='@'){break;}else{x[t2]=c;t2++;continue;}}for (i=ntext;i>=a;i--){k.sr[i+t2]=k.sr[i];}for (i=0;i<t2;i++){k.sr[i+a]=x[i];}ntext=ntext+t2;printf("\n当前文本信息为:\n");for (i2=0;i2<=ntext-1;i2++)printf("%c",k.sr[i2]);printf("插入成功\n");fflush(stdin);getchar();}if (d=='r'||d=='R'||pd=='r'||pd=='R') {l=0;charu(k,l);}FILE *fp;int b11;fprintf(fp,"The contents is\n");for (b11=0;b11<=ntext-1;b11++)fprintf(fp,"%c",k.sr[b11]);fclose(fp);}void tihan(shuru &r,int l) //内容替换{int t=0,t1=0,i,a;char c,th[20],d,d1,bth[20];int i2;printf("\n当前文本信息为:\n");for (i2=0;i2<=ntext-1;i2++)printf("%c",r.sr[i2]);printf("\n输入要被替换的内容,以@结束:");fflush(stdin);while ((c=getchar())!='@') //t指替换前内容的长度{if (c=='@'){break;}else{bth[t]=c;t++;continue;}}a=strindex(r,bth,t,l); //查找要被替换的内容的位置if (a!=-1){l=a+t;}int hs=1,ls=0;for (b=0;b<a;b++){ls++;if (r.sr[b]=='\n'){hs++;ls=0;}}if (a==-1){printf("\n查找到结尾没有找到要被替换的内容\n继续查找请按R,双击回车键退出\n");l=0;//printf("\n%d",a);//printf("\n%d",i1);//printf("\n%d",ntext);fflush(stdin);d=getchar();fflush(stdin);}else{printf("\n\n已经找到要查找的数据:\n\t\t在第%d行,第%d列\nR:继续向后查找相同内容\nA:进一步进行替换操作\n请选择:",hs,ls+1);//printf("\n%d",a);//printf("\n%d",i1);//printf("\n%d",ntext);fflush(stdin);d=getchar();}if (d!='r'&&d!='R'){printf("\n是否要替换该内容?\nA:替换给内容\n双击回车键:返回主菜单\n请选择:");fflush(stdin);d1=getchar();if (d1=='a'||d1=='A'){printf("\n输入要替换的内容,以@结束:");fflush(stdin);while ((c=getchar())!='@') //t1指替换后的内容长度{if (c=='@'){break;}else{th[t1]=c;t1++;continue;}}if (t==t1) //将要被替换的内容和替换后的内容进行长度比较{for (i=0;i<t1;i++)r.sr[i+a]=th[i];}else{if (t>t1){for (i=0;i<t1;i++){r.sr[i+a]=th[i];}for (i=a+t1;i<ntext;i++){r.sr[i]=r.sr[i+t-t1];}ntext=ntext+t1-t;}else{for (i=ntext;i>=a;i--){r.sr[i+t1-t]=r.sr[i];}for (i=0;i<t1;i++){r.sr[i+a]=th[i];}ntext=ntext+t1-t;}}printf("替换成功");printf("\n当前文本信息为:\n");for (i2=0;i2<=ntext-1;i2++)printf("%c",r.sr[i2]);getchar();}}if (d=='R'||d=='r')tihan(r,l);FILE *fp;int b11;fprintf(fp,"The contents is\n");for (b11=0;b11<=ntext-1;b11++)fprintf(fp,"%c",r.sr[b11]);fclose(fp);}int main(){shuru t;char n,i='0',p='a';int a3=0;printf("\n\n\n\n\n\n\n\n\n\t\t\tWelcom to use our TXT edition system!\n");printf("\n\n\t\t\t 欢迎您使用文本编辑器软件!\n");printf("\n\n\n\n\n\n\n\n\npress Enter to continue...\n");getchar();L1:{system("cls");printf("\n\n The Function Of TXT Edition List \n ");printf("\n**************************************************************\n * *");printf("\n * 0---------clear all contents list *\n * *");printf("\n * 1---------Display all contents list *\n * *");printf("\n * 2---------Input contents list *\n * *");printf("\n * 3---------Lookfor contents list *\n * *");printf("\n * 4---------replace contents list *\n * *");printf("\n * 5---------insert contents list *\n * *");printf("\n * 6---------move contents list *\n * *");printf("\n * 7---------delete contents list *\n * *");printf("\n * 8---------exit contents list*\n * *");printf("\n**************************************************************\n");if (i=='0')printf("\ninput the number before function of you want to select:");else{printf("\ninput error! please select again");printf("\n\ninput the number before function of you want to select:");}}fflush(stdin);scanf("%c",&n);switch (n){case '0':system("cls");cs(t);i='0';getchar();goto L1;break;case '1':system("cls");xs(t);i='0';getchar();goto L1;break;case '2':system("cls");b++;if (b==1)ntext=0;Input(t);i='0';goto L1;break;case '3':system("cls");chazhao(t,a3);i='0';getchar();goto L1;break;case '4':system("cls");tihan(t,a3);i='0';getchar();goto L1;break;case '5':charu(t,a3);i='0';getchar();goto L1;break;case '6':system("cls");kuaiyidong(t);i='0';getchar();goto L1;break;case '7':system("cls");shanchu(t,a3,p);i='0';getchar();break;case '8':system("cls");printf("\n\n\n\n\n\n\n\n\n\t\t\tThanks to use our program!\n\n\n\n\n\n\n\n");break;}if (n!='0'&&n!='1'&&n!='2'&&n!='3'&&n!='4'&&n!='5'&&n!='6'&&n!='7'&&n!='8'){i='1';goto L1;}}4调试分析5用户手册⑴清空以前的文本信息:将用数组存的数据内容全部置为0;⑵显示当前文本信息:遍历用数组存入的信息,并输入到外部显示器上;⑶编辑信息:定义一个结构体,并在结构体中定义一个字符型的一维数组和一个整型变量,这个整型变量用于记录一维数组中存入数据的个数;⑷替换文本信息:首先在数组中查找要被替换的信息,如果找到该信息,提示输入要替换的信息内容,否则提示未找到要被替换的信息;⑸插入文本信息:首先在数组中查找要插入点,如果找到该插入点,提示输入插入信息,确认插入信息后,提示选择向前插入信息还是向后插入信息,如果未找到插入点,显示未找到要插入的位置;⑹移动文本信息:首先在数组中查找要移动的信息,如果找到该信息,提示是进行列移动还是进行行移动,否则提示未找到要移动的信息;⑺删除文本信息:首先在数组中查找要删除的信息,如果找到该信息,提示是否确认删除该信息,通过确认来删除信息,如果未找到要删除的信息,提示未找到该信息;⑻退出编辑器:显示感谢使用该软件并退出。

C语言编写的文本编辑器

C语言编写的文本编辑器

C语言编写的文本编辑器在现代的计算机应用领域中,文本编辑器是一个不可或缺的工具。

它们提供了一种方便的方式来编辑、查看和管理文本文件。

C语言作为一种高级编程语言,被广泛应用于软件开发领域。

本文将介绍如何使用C语言编写一个简单的文本编辑器。

一、概述文本编辑器是一种计算机程序,旨在帮助用户处理文本文件。

它们提供了一系列功能,如插入、删除、复制、粘贴和查找等,以便用户可以轻松编辑文本。

C语言作为系统级编程语言,具有高效的内存管理和强大的控制能力,非常适合编写文本编辑器。

二、设计思路在开始编写文本编辑器之前,需要明确其基本功能和设计思路。

一个简单的文本编辑器应具备以下功能:1. 新建、打开、保存文本文件;2. 插入、删除、复制、粘贴文本内容;3. 查找和替换文本内容;4. 撤销和重做操作。

基于以上功能,我们可以使用C语言的字符串处理函数和文件操作函数来实现文本编辑器。

三、核心代码下面是一个简化版本的C语言文本编辑器的核心代码示例:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_LENGTH 1000int main() {char buffer[MAX_LENGTH];FILE *file;char filename[100];int choice;printf("欢迎使用简单文本编辑器\n");while (1) {printf("\n1. 新建文件\n2. 打开文件\n3. 保存文件\n4. 插入文本\n5. 删除文本\n6. 复制文本\n7. 粘贴文本\n8. 查找文本\n9. 替换文本\n10. 撤销操作\n11. 重做操作\n12. 退出\n");printf("请输入选项:");scanf("%d", &choice);switch (choice) {case 1:printf("请输入文件名:"); scanf("%s", filename);file = fopen(filename, "w"); if (file == NULL) {printf("无法创建文件\n"); }break;case 2:printf("请输入文件名:"); scanf("%s", filename);file = fopen(filename, "r"); if (file == NULL) {printf("文件不存在\n"); }break;case 3:if (file == NULL) {printf("请先新建或打开文件\n");} else {fclose(file);printf("文件已保存\n");file = NULL;}break;case 4:if (file == NULL) {printf("请先新建或打开文件\n");} else {printf("请输入要插入的文本:"); fgets(buffer, MAX_LENGTH, stdin); fputs(buffer, file);fflush(file);}break;// 其他功能代码省略...case 12:if (file != NULL)fclose(file);printf("感谢使用简单文本编辑器,再见!\n");exit(0);default:printf("无效的选项\n");break;}}return 0;}```该代码演示了一个简单的文本编辑器,用户可以通过输入选项来执行各种功能。

C#简单文本编辑器的设计代码

C#简单文本编辑器的设计代码

1简单文本编辑器二、添加方法在class Form1类中定义两个变量:private string Fname; Fname; ////存放打开的文件名private void FileOpen() FileOpen() ////打开文件方法(1)添加“未保存处理”方法private void NotSaveProcess() NotSaveProcess() ////没有保存处理方法{if if (richTextBox1.Modified) (richTextBox1.Modified) ////如果richTextBox1中的文本被修改{if if ( (MessageBox MessageBox .Show(.Show(""文件未保存,是否保存?", , ""保存提示", , MessageBoxButtons MessageBoxButtons .YesNo) == DialogResult .Yes){if if (Fname == (Fname == """")SaveAs();else else{if if (FExtName == (FExtName == "txt""txt")richTextBox1.SaveFile(Fname, RichTextBoxStreamType .PlainText);else elserichTextBox1.SaveFile(Fname, RichTextBoxStreamType .RTFText);}}}}(2)添加“新建”文件方法private void NewFile() NewFile() ////新建文件方法{NotSaveProcess();Fname = Fname = """";FExtName = FExtName = "txt""txt"; richTextBox1.Text = richTextBox1.Text = """";this this .Text = .Text = ""新建-简单文本编辑器";richTextBox1.Modified = richTextBox1.Modified = false false ;//lblSave.Text="//lblSave.Text="已保存";}(3)添加“打开”文件方法添加一个richTextBox 控件、一个OpenFileDialog 控件private void FileOpen() FileOpen() ////打开文件方法{openFileDialog1.Filter = openFileDialog1.Filter = ""文本文件(*.txt)|*.txt|RTF 格式文件(*.RTF)|*.RTF";//设置过滤器属性openFileDialog1.FilterIndex = 1; //设置当前文件过滤器openFileDialog1.Title = openFileDialog1.Title = ""打开文件"; ; ////设置对话框标题openFileDialog1.InitialDirectory = Application .StartupPath;.StartupPath;////初始目录设为启动路径 openFileDialog1.RestoreDirectory = true ; ; ////自动回复初始目录openFileDialog1.ShowDialog(); //弹出打开文件对话框Fname = openFileDialog1.FileName;//获取打开的文件名if if (Fname != (Fname != """"){if if (openFileDialog1.FilterIndex == 1)//如果是文本文件richTextBox1.LoadFile(Fname, RichTextBoxStreamType .PlainText);else elserichTextBox1.LoadFile(Fname, RichTextBoxStreamType .RichText);//RTF 文件}this this .Text = Fname + .Text = Fname + "-"-简单文本编辑器";//窗体标题栏显示的信息}(4)添加“保存”方法private void Save() Save() //"//"保存"方法{if if (richTextBox1.Modified){if if (Fname == (Fname == """")SaveAs();else elseif if (FExtName == (FExtName == "txt""txt")richTextBox1.SaveFile(Fname, RichTextBoxStreamType .PlainText);else elserichTextBox1.SaveFile(Fname, RichTextBoxStreamType .RichText);} richTextBox1.Modified = richTextBox1.Modified = false false ;//lblSave.Text="//lblSave.Text="已保存";}(5)添加“另存为”方法添加一个SaveFileDialog 控件(对话框选项卡下),该控件主要作用用来弹出Windows 中的“另存为”对话框。

C++课程设计报告(简易文本编辑器)

C++课程设计报告(简易文本编辑器)

中国矿业大学银川学院面向对象程序设计课程设计报告(2011/2012学年第二学期)题目名称简单文本编辑器的设计系部机电动力与信息工程系专业计算机科学与技术班级 10级计算机(1)班学生牛建强完成时间 2011年 6 月指导老师石晓山在文本编辑器出现前,人们用打孔机把计算机文字打到穿孔卡片上。

文字存放于一个装着这样的薄卡片的盒子里,可以用读卡器来阅读它。

第一个文本编辑器是一种行编辑器,它运行在打字机型的终端上,这种编辑器并不具备在窗口和屏幕中显示的功能。

它包含了一些非常短的命令(为了减少打字量)。

其中一个命令能够把文件的指定部分通过打字机打印出来。

编辑光标是想象中的一个插入点,通过特殊命令,可以把它移动到特定内容字符串所在的行。

随后,内容字符串又被扩展成正则表达式。

如果想看到文件的变化,你需要把它打印出来。

相对于穿孔机来说,人们认为这种基于行的文本编辑器具有革命性的进步。

如果没有它,用户就需要把那些处理文本的命令打成专用的卡片,并在编辑文件时使用这些卡片。

当带有显示屏的计算机终端出现后,基于显示屏的文本编辑器开始流行起来。

最早的全屏编辑器中,有一种叫做O26,它是于1967年为CDC 6000系列机器的操作控制台而作的。

另外一个早期的全屏编辑器是vi。

vi诞生于20世纪70年代,至今,它仍是Unix和Linux的标准编辑器。

全屏编辑器对视频终端的销售起到了促进的作用。

文本编辑器在Windows的应用中是一个非常重要的项目,在过去十数年中,微软对windows文本编辑器有多个版本的升级改进,而基于其他的编程环境的文本编辑器也是多如牛毛,今天我们用MFC可视化编译环境做一个简易的文本编辑器。

引言 (2)1.课程设计目的和意义 (4)2.详细设计 (4)2.1需求描述 (4)2.1.1文件 (4)2.1.2编辑 (4)2.1.3应用 (5)2.1.4帮助 (5)2.1.5高级 (5)2.2功能描述 (5)2.2.1文本编辑区 (5)2.2.2文件 (7)2.2.3编辑 (15)2.2.4应用 (16)2.2.5帮助 (21)2.2.6高级 (22)2.2.7菜单栏 (25)2.2.7图标 (26)2.3程序运行说明 (27)3.课程设计总结 (30)3.1编程日志 (30)3.3测试报告 (31)4.心得体会 (31)5.参考文献 (31)1.课程设计目的和意义《面向对象程序设计》课程设计是实践性教学环节之一,是《面向对象程序设计》课程的辅助教学课程。

简易文本编辑器

简易文本编辑器

#include <iostream>#include <fstream>#include <vector>#include <string>class TextEditor {public:void run();private:std::vector<std::string> lines;void displayMenu();void addLine();void editLine();void deleteLine();void findText();void saveToFile();void loadFromFile();void displayText();};void TextEditor::run() {int choice;do {displayMenu();std::cin >> choice;std::cin.ignore(); // 忽略选择输入后的换行符switch (choice) {case 1: addLine(); break;case 2: editLine(); break;case 3: deleteLine(); break;case 4: findText(); break;case 5: saveToFile(); break;case 6: loadFromFile(); break;case 7: displayText(); break;case 0: std::cout << "退出...\n"; break; default: std::cout << "无效的选择。

请重试。

\n"; }} while (choice != 0);}void TextEditor::displayMenu() {std::cout << "\n文本编辑器菜单:\n";std::cout << "1. 添加行\n";std::cout << "2. 编辑行\n";std::cout << "3. 删除行\n";std::cout << "4. 查找文本\n";std::cout << "5. 保存到文件\n";std::cout << "6. 从文件加载\n";std::cout << "7. 显示文本\n";std::cout << "0. 退出\n";std::cout << "请输入您的选择: ";}void TextEditor::addLine() {std::string line;std::cout << "请输入要添加的文本: ";std::getline(std::cin, line);lines.push_back(line);}void TextEditor::editLine() {int lineNumber;std::string newLine;std::cout << "请输入要编辑的行号: ";std::cin >> lineNumber;std::cin.ignore(); // 忽略行号输入后的换行符if (lineNumber > 0 && lineNumber <= lines.size()) { std::cout << "请输入新的文本: ";std::getline(std::cin, newLine);lines[lineNumber - 1] = newLine;} else {std::cout << "无效的行号。

简易文本编辑器

简易文本编辑器

简易文本编辑器猴子吃桃子问题二〇一四 年 六 月猴子吃桃子问题i ,n=2*n+2,e#define TRUE 1#define FALSE 0#define ERROR 0#define OVERFLOW 0#define OK 1#define NULL 0typedef int Status;typedef int ElemType;struct LNode{软件综合课程设计ElemType data;LNode *next;};typedef LNode *LinkList;void InitList(LinkList &L)//构造一个空链链表{L=(LinkList)malloc(sizeof(LNode));//产生头结点,并使L指向此头结点if(!L) exit(OVERFLOW);L->next=NULL;}Status GetElem(LinkList L,int i,ElemType &e)//当第i个元素存在的时,将其值赋给ees->next=p->next;//新结点指向原第i个结点p->next=s;//原第i-1个结点指向新结点return 1;}void shuju(){int da,tao[11]; //定义数组和下标tao[0]=0; //tao[0]赋值为0tao[1]=1; //倒数第一天的桃子数为1for(da=2;da<=10;da++)tao[da]=3*pow(2,da-1)-2; //给数组的赋值printf("最初的桃子数为%d\n",tao[10]);//输出最初的桃子数}int sum_fan(int n,int i) //子函数sum_fun,参数n和i接受主函数的参数 x和day{if (i>0){n=sum_fan((n+1)*2,--i); //每一次都用((n+1)*2)的值去调用子函数本身}return n; //返回结果}switch(t){case 2: sum=sum_fan(x,day); //调用子函数sum_fan,并把返回得结果赋给sumprintf("%d",sum);break;case 1: shuju();break;case 3: for(i=1,n=1;i<=10;i++){n=2*n+2;//将每一天的桃子数赋值给nListInsert(L,1,n);//将n的值输入链表}GetElem(L,2,e);printf("最初的桃子数为%d",e);//输出桃子的数目break;}if(t==4) break;}while(1); }3.运行结果(1)数组数据结构实现结果,如图3-1所示:2)中应有如下提示信息:⑴显示当前文本信息:从文件中读出文本,在某一个盘中创建一个文本文件,所以要读出来,显示到显示器上,并统计出行数。

C语言文本编辑器设计

C语言文本编辑器设计

C语言文本编辑器设计
一、项目要求
设计一款文本编辑器,通过选择,实现如下6项功能:
选择操作:1,新建文件。

输入1,选择添加文本,输入0,返回菜单操作界面。

按任意键返回…
选择操作:2,打开指定路径下指定文件,同时输出文本内容。

询问是否添加文本?(0/1)。

输入1,添加,输入0,返回操作菜单界面。

按任意键返回操作菜单。

从操作菜单,再次选择2,打开添加文本后的file1.txt文件,查看效果如下:
选择操作:3,实现文件的复制、粘贴。

按任意键,返回操作菜单界面。

选择2,打开复制粘贴的file2.txt文件,验证如下:
选择操作:4,打开指定文件,查找指定字符,输出第一次查到字符位置。

选择操作:5,打开指定文件,输入查找字符,替换为指定字符。

二、相关知识
1. 文件的打开与关闭
2. 字符数组
打开file1.txt文件,验证替换后效果。

选择操作:6,打开指定文件,统计文件中字符、数字和其他字符个数,并输出。

简易文本编辑器

简易文本编辑器

简易文本编辑器猴子吃桃子问题二〇一四 年 六 月猴子吃桃子问题i ,n=2*n+2,e#define TRUE 1#define FALSE 0#define ERROR 0#define OVERFLOW 0#define OK 1#define NULL 0typedef int Status;typedef int ElemType;struct LNode{软件综合课程设计ElemType data;LNode *next;};typedef LNode *LinkList;void InitList(LinkList &L)//构造一个空链链表{L=(LinkList)malloc(sizeof(LNode));//产生头结点,并使L指向此头结点if(!L) exit(OVERFLOW);L->next=NULL;}Status GetElem(LinkList L,int i,ElemType &e)//当第i个元素存在的时,将其值赋给ees->next=p->next;//新结点指向原第i个结点p->next=s;//原第i-1个结点指向新结点return 1;}void shuju(){int da,tao[11]; //定义数组和下标tao[0]=0; //tao[0]赋值为0tao[1]=1; //倒数第一天的桃子数为1for(da=2;da<=10;da++)tao[da]=3*pow(2,da-1)-2; //给数组的赋值printf("最初的桃子数为%d\n",tao[10]);//输出最初的桃子数}int sum_fan(int n,int i) //子函数sum_fun,参数n和i接受主函数的参数 x和day{if (i>0){n=sum_fan((n+1)*2,--i); //每一次都用((n+1)*2)的值去调用子函数本身}return n; //返回结果}switch(t){case 2: sum=sum_fan(x,day); //调用子函数sum_fan,并把返回得结果赋给sumprintf("%d",sum);break;case 1: shuju();break;case 3: for(i=1,n=1;i<=10;i++){n=2*n+2;//将每一天的桃子数赋值给nListInsert(L,1,n);//将n的值输入链表}GetElem(L,2,e);printf("最初的桃子数为%d",e);//输出桃子的数目break;}if(t==4) break;}while(1); }3.运行结果(1)数组数据结构实现结果,如图3-1所示:2)中应有如下提示信息:⑴显示当前文本信息:从文件中读出文本,在某一个盘中创建一个文本文件,所以要读出来,显示到显示器上,并统计出行数。

C语言实现简易文本编辑器

C语言实现简易文本编辑器

C语⾔实现简易⽂本编辑器本程序要求完成⼀个简易⽂本编辑器,能够完成⽂本的录⼊、编辑、删除、查找,并能够完成⽂件的存取。

在⽂本编辑软件中把⽤户输⼊的所有⽂本内容作为⼀个字符串。

虽然各种⽂本编辑软件的功能有强弱差别,但是基本操作都包括串的输⼊、修改、删除(包括整⾏删除和⼀⾏中的⼦串删除)、查找、输出等。

通过分析,系统应该包括以下功能:1、具有简单的⽂字或图形菜单界⾯2、能实现串或⽂本块的查找、替换、删除、插⼊、移动操作。

3、能实现⽂本⽂件的存盘和读取功能。

4、具有友好的界⾯和较强的容错能⼒设计思路1、采⽤的逻辑结构⽂本编辑器主要是针对⽂本进⾏编辑,⽂本的操作就是对字符的操作。

⽂本编辑器可以从⾏、列两个⽅向进⾏编辑。

每⼀⾏可以看成⼀个线性表,线性表是⼀种线性结构,线性结构的特点是数据元素之间为线性关系,数据元素“⼀个接⼀个的排列”。

在⼀个线性表中数据元素的类型是相同的,由于每⼀⾏可以存储的最⼤字数是相同的,⾏⽅向所有线性表的最⼤长度可以设置成相同的。

⾏与⾏之间的关系也可以看成⼀个线性表。

2、采⽤的存储结构线性表的存储分为两种:顺序存储和链式存储。

顺序存储是指在内存中⽤地址连续的⼀块存储空间顺序存放线性表的各元素,⽤这种存储形式存储的线性表称为顺序表。

在程序设计语⾔中,⼀维数组在内存中占⽤的存储空间就是⼀组连续的存储区域,因此,⽤⼀维数组来表⽰顺序表的数据存储区域是再合适不过的。

链式存储是通过-组任意的存储单元来存储线性表中的数据元素的,为建⽴数据元系之间的线性关系,对每个数据元素除了存放数据元素⾃⾝的信息之外,还需要和⼀起存放其后继或前驱所在的存储单元的地址,这两部分信息组成⼀个“结点”,每个元素都如此。

存放数据元素信息的称为数据域,存放其前驱或后继地址的称为指针域。

只有⼀个存储单元地址的为单链表,有两个存储单元地址的为双链表。

考虑到实际的功能需求,每⾏的线性表可以⽤顺序存储⽅式,每个字符是⼀个节点。

C#简单文本编辑器

C#简单文本编辑器

C#简单文本编辑器[简单文本编辑器]一、项目内容及要求要求:1)设计和实现“文件”菜单(提供“新建”、“打开”、“保存”、“另存为”、“退出”功能)2)设计和实现“编辑”菜单(提供“撤销”、“恢复”、“剪切”、“复制”、“粘贴”功能)3)对窗体中的文本内容提供“格式”菜单。

界面如下图所示:文件操作:包括文件的新建、打开、保存、另存为及退出。

编辑功能:包括撤销、还原、全选、剪切、复制、粘贴。

字体设置:包含字体、字体颜色及大小的设置二、算法分析(描述清楚程序流程,可用自然语言说明,也可用流程图等说明。

)一.界面设计1.新建Windows窗体应用程序。

向其中添加RichTextBox控件、MenuStrip控件、openFileDialog控件、saveFileDialog1、fontDialog、colorDialog。

2.添加菜单:a.文件(新建、打开、保存、另存为、退出)。

b.编辑(撤销、还原、剪切、复制、粘贴、全选)。

c.格式(字体、颜色)二.代码编写1.定义窗体全局变量并设置初始值fname = ""; //文件名issave = false; //文档是否保存过tchange = false; //文档是否修改过。

2.双击新建菜单,输入新建事件代码:a.如果当前文档没有保存,则保存当前文档;b.清空richT extBox1;c.设置issave、tchange、fname值。

3.输入打开事件代码:a.设置openFileDialog控件Title、FileName、Filter的初始值。

b.使用openFileDialog1.ShowDialog()方法打开“打开文件”对话框。

c.将openFileDialog控件的文件名存入fname。

d.使用richTextBox1.LoadFile方法打开文件。

e.设置issave、tchange的值。

4.输入保存事件代码:a.如果fname不为空,则使用richTextBox.SaveFile方法保存文件,设置issave值。

文本编辑器C代码

文本编辑器C代码

文本编辑器C代码/*文本编辑器editor源代码*/#include#include#include#include#define LEFT 0x4b00 /*←:光标左移*/#define RIGHT 0x4d00 /*→:光标右移*/#define DOWN 0x5000 /*↓键:光标下移*/#define UP 0x4800 /*↑键:光标上移*/#define ESC 0x011b /*ESC键:取消菜单打开操作*/#define ENTER 0x1c0d /*回车键:换行*/#define DEL 21248 /*DEL键:删除当前字符*/#define BACK 3592 /*BackSpace键:删除当前光标位置前一个字符*/#define CL 29440 /*ctrl+←键:从右至左,选定文本*/#define CR 29696 /*ctrl+→键:从左到右,选定文本*/#define Cc 11779 /*ctrl+c键:将选定文本,复制一份到剪贴板中*/#define Cv 12054 /*ctrl+v键:将剪贴板中的内容复制到当前位置*/#define Cx 11544 /*ctrl+x键:对选定文本,执行剪切操作*/#define F1 15104 /*F1键:打开文件菜单*/#define F2 15360 /*F2键:打开编辑菜单*/#define F3 15616 /*F3键:打开帮助菜单*/#define F10 17408 /*F10键:进入文本快速预览模式*/int value,backup,NUM;/*value保存有值数组元素的最大下标值,backup保存value的副本,NUM保存当前行中的用户输入的字符个数*/typedef struct record{char ch; /*保存一字符*/int col, line; /*x轴和y轴坐标*/}record;record r[500]; /*定义一个有500个元素的结构体数组,保存选定的文本字符的属性*/typedef struct node /*定义保存行中的单个字符的结构*/{char ch; /*数据域:保存一字符*/struct node *next; /*指针域:指向下一个结点的指针*/}node;/*由此类型节点构成的单链表,命名为:列单链表*/typedef struct Hnode /*定义保存所有列单链表首节点的指针的结构*/{node *next; /*指向列单链表的首节点的地址*/struct Hnode *nextl; /*指向下一个节点的指针*/}Hnode;/*由此类型节点构成的单链表,命名为:行单链表*/void drawmain() /*画主窗口函数*/{int i,j;gotoxy(1,1); /*在文本窗口中设置光标至(1,1)处*/textbackground(7); /*选择新的文本背景颜色,7为LIGHTGRAY 淡灰色*/ textcolor(0); /*在文本模式中选择新的字符颜色0为BLACK 黑*/ insline(); /*在文本窗口的(1,1)位置处中插入一个空行*/ for(i=1;i<=24;i++){gotoxy(1,1+i); /*(x,y)中x不变,y++*/cprintf("%c",196); /*在窗口左边输出-,即画出主窗口的左边界*/gotoxy(80,1+i);cprintf("%c",196); /*在窗口右边,输出-,即画出主窗口的右边界*/ }for(i=1;i<=79;i++){gotoxy(1+i,2); /*在第2行,第2列开始*/cprintf("%c",196); /*在窗口顶端,输出-*/gotoxy(1+i,25); /*在第25行,第2列开始*/cprintf("%c",196); /*在窗口底端,输出-*/}gotoxy(1,1); cprintf("%c",196); /*在窗口左上角,输出-*/gotoxy(1,24); cprintf("%c",196); /*在窗口左下角,输出-*/gotoxy(80,1); cprintf("%c",196); /*在窗口右上角,输出-*/gotoxy(80,24); cprintf("%c",196); /*在窗口右下角,输出-*/gotoxy(7,1); cprintf("%c %c File %c %c",179,17,16,179); /* | < > |*/ gotoxy(27,1); cprintf("%c %c Edit %c %c",179,17,16,179); /* | < > |*/ gotoxy(47,1); cprintf("%c %c Help %c %c",179,17,16,179); /* | < > |*/ gotoxy(5,25); /*跳至窗口底端*/textcolor(1);cprintf(" Row:1 Col:1");gotoxy(68,25);cprintf("Version 2.0");}void qview(Hnode *q) /*快速预览文本:开头:#,回车:* */{void view(Hnode *q); /*view()函数声明*/node *p;int i;window(1,1,80,25); /*定义文本窗口大小*/clrscr(); /*清屏*//*循环读取两个单链表中的值:q是一个指向行单链表首节点的指针,此单链表数据域的值为实际保存各行字符的列单链表p中的首节点地址*/do{p=q->next; /*p指向保存行数据的列单链表的首节点的地址*/cprintf("#"); /*每行开头,打印此字符,不管前面是否有回车符*/ while(p!=NULL) /*循环读取单链表p中的值*/{if(p->ch==13) putch('*'); /*若为回车键,打印出*号*/elseputch(p->ch); /*输出各行中的字符到预览窗口*/p=p->next; /*指向下一个节点*/}q=q->nextl; /*指向下一个节点*/printf("\");/*输出一个回车*/}while(q!=NULL);getch();clrscr();drawmain();/*按任意键后,回到主窗口界面*/window(2,2,79,23);textbackground(9);for(i=0;i<24;i++)insline(); /*插入24个空行*/window(3,3,78,23);textcolor(10);}void view(Hnode *q) /*按行显示保存在单链表中的文本字符,q为指向行单链表中第一个节点的指针*/{node *p; /*p为保存列单链表节点元素地址的指针*/clrscr(); /*清屏*//*双重循环,读取并显示保存在单链表中字符*/do{p=q->next;while(p!=NULL&&p->ch>=32&&p->ch<127&&p->ch!=13 &&p->ch!=-1)/*指针p不能为空,且数据域必须为常规字符*/{putch(p->ch);/*在文本窗口中输出该字符*/p=p->next; /*指向下一个节点*/}q=q->nextl; /*指向下一个节点*/if((p->ch==13||p->ch==-1)&&q!=NULL)gotoxy(1,wherey()+1); /*若ch为回车或EOF标记,光标跳至下行的开始处*/ }while(q!=NULL); /*逐行逐列显示文本字符*/}int check(Hnode *Hhead,int m,int n) /*check():在单链表中检查第m行第n列位置的字符,若为常规字符,则返回该字符*/{int i;Hnode *q;node *p;q=Hhead;for(i=1;i<="" bdsfid="197" p="">q=q->nextl;p=q->next;/*获取第m个节点的数据域*/for(i=1;i<="" bdsfid="201" p="">p=p->next;if(p->ch==13) return -1; /*若第m行,第n列的字符为回车键,则返回-1*/if(p->ch>=32&&p->ch<127) return p->ch; /*若第m行,第n列的字符为常规字符,则返回该字符*/else return 0; /*若第m行,第n列的字符既非回车符又非常规字符,则返回0*/}int judge(Hnode *Hhead,int m) /*judge():返回第m行中的常规字符总的个数,不包括回车符*/ {Hnode *q;node *p;int i,num=0;q=Hhead;for(i=1;i<="" bdsfid="214" p="">q=q->nextl;if(q==NULL) return -1; /*返回-1,表示第m行不存在*/p=q->next;while(p->next!=NULL){p=p->next;num++; /*统计第m行的字符个数*/}/*行尾字符还没有判断,接下来判断行尾字符*/if(p->ch==13&&num==0) return 0; /*返回0,表示当前行只有一个回车字符*/if(p->ch>=32&&p->ch<127) return num+1; /*返回num+1,表示当前行的最后一个字符为常规字符*/if(p->ch==13&&num!=0) return num; /*返回num,表示当前行的最后一个字符为回车符,不计算在内*/else return 1;/*返回num,表示当前行中只有一个字符,且没有回车符*/}int del(Hnode *Hhead,int m,int n) /*del():删除第m行,第n列位置的字符*/{Hnode *q,*q1;node *p1,*p2,*tail;int i,num=0,j,flag=0;q=Hhead;if(n==0&&m==1) return; /*第1行,第0列不存在*/if(n==0&&m>1) /*若为第0列字符,但行必须大于1,执行向上行移处理*/{n=76;m=m-1;gotoxy(n,m);/*移至第m-1行,第76列*/flag=1; /*移位的标志置1*/}for(i=1;i<="" bdsfid="246" p="">{q=q->nextl;}p1=q->next;for(i=1;i<="" bdsfid="252" p="">{p1=p1->next;}p2=p1->next; /*p2指向列单链表中的第n个元素*/if(n==1) /*若是删除第m行第1列的字符*/{q->next=p1->next;free(p1);}else{p1->next=p2->next; /*在单链表中删除第m行第n列的元素*/ free(p2);}/*删除掉第m行第n列的元素后,处理行单链表中第m个节点后的数据向前移务*/ while((num=judge(Hhead,m++))>0) /*执行一次judge(Head,m)后,m才加1.这里必须满足行常规字符数不为0的条件*/{p1=q->next; q1=q;if(p1!=NULL) /*若当前行非空*/{while(p1->next!=NULL)p1=p1->next;tail=p1;/*tail保存列单链表最后一个元素的地址*/q=q->nextl; /*指向下一行的元素的地址*/p1=p2=q->next;tail->next=p1; /*tail的指针域指向下一行的第一个元素的地址*/ }else /*若当前行的字符个数为0,即删除该字符后,只剩下回车符,则将下一个行单链表中节点的数据域移至前一下节点的数据域*/{q=q->nextl;p1=p2=q->next;q1->next=p1;/*q1->next指向下一行的第一个元素的地址*/}for(i=0;i<76-num;i++)/*当前行还有76-num个空位没有字符,在下一行的单链表中读取字符,直至遇到回车符为止*/{p1=p2; /*p1指向p2的前一个节点,p2指向行单链表中下一个节点*/p2=p2->next;if(p2->ch==13) break; /*若为回车,跳出循环*/}q->next=p2; /*在列单链表中去掉移至上行的元素*/p1->next=NULL;/*下行移至上行的最后一个元素,指针置空*/ }return flag; /*返回0:表示没有换位,返回1:表示有换位*/}/*执行insert()后,检验第n行及后面的数据,使其满足规则*/ int test(Hnode *Hhead,int n){int i=0,num1=1;node *p1,*p2,*tail,*temp1,*temp2;Hnode *q;q=Hhead;for(i=1;i<="" bdsfid="306" p="">q=q->nextl;tail=p1=q->next;if(p1==NULL) return; /*若此行没有任何字符,则返回*/while(tail->next!=NULL) /*定位至列单链表中的最后一个元素*/ tail=tail->next;/*若此单链表中没有回车符且有超过76个节点时,则p1会指向此列单链表中的第76个节点*/for(i=0;i<75;i++){if(p1->ch==13||p1->next==NULL) break;p1=p1->next;}p2=p1->next;p1->next=NULL; /*在此行的最后一个字符的前一个字符处断行,因为插入在此行插入了一个新的字符*/if(tail->ch!=13) /*若此行行尾不是回车键*/{if(p1->ch==13&&q->nextl==NULL)/*若p1的数据域为回车符且行单链表中只有n个节点*/{q->nextl=(Hnode *)malloc(sizeof(Hnode)); /*新建一个行单链表节点,相当于添加一个新行*/q->nextl->nextl=NULL;tail->next=(node *)malloc(sizeof(node));/*在tail所指节点位置开始继续准备添加字符*/tail->next->ch=13; tail->next->next=NULL;q->nextl->next=p2; /*新行单链表节点保存此行多出的字符*/ }else /*若此行行尾和行中都没有回车键,或者q->nextl不为空*/ {q=q->nextl;/*q->nextl有可能为空*/tail->next=q->next;/*将多出的字符与下一行的字符相连*/q->next=p2;/**/if(q!=NULL) test(Hhead,++n); /*若行单链表第n个节点后还有节点,继续test()的相同处理*/}}else /*若此列单链表最后一个元素为回车符*/{temp2=p2; /*p2指向第77个字符,或者为空(为空表示此行插入一个字符后,没有超出范围*/while(q!=NULL&&p2!=NULL) /*q指向行列表中的第n个节点.条件:行单链表中第n个节点存中且有第77个字符*/ { /*条件:在行单链表中只有n 个节点,且字符超过了一行规定的76个,且num1标志为1*/ if((q->nextl==NULL)&&(p1!=tail||p2!=NULL)&&(num1==1)) {num1++;q->nextl=(Hnode *)malloc(sizeof(Hnode)); /*新建一个行单链表节点,准备存储此行中多出的字符*/q->nextl->nextl=NULL; q->nextl->next=NULL; /*初始化值*/ }/*行单链表中第n+1个节点已经存在,下面为在行单链表中插入一个新的节点*/q=q->nextl; /*q指向行列表中的第n+1个节点*/temp1=q->next;q->next=temp2; /*q的数据域为此行中多出的字符所在的列单链表中的节点地址*/temp2=temp1;}}}void insert(Hnode *Hhead,int m,int n, char a) /*第m行,第n 列的位置之前一个位置,插入单字符*/{int i;Hnode *q;node *p,*p1,*p2;q=Hhead;for(i=1;i<="" bdsfid="372" p="">q=q->nextl;p1=q->next;for(i=1;i<="" bdsfid="376" p="">p1=p1->next;p=(node *)malloc(sizeof(node)); /*创建一个新的列单链表节点*/p->ch=a; /*给此节点的数据域赋值*/if(n==1) /*插入之前,若只有一个字符在行中,则插在此节点之前*/{p->next=q->next;q->next=p;}else{p->next=p1->next; /*在第m行,第n列的字符前,插入一字符*/p1->next=p;}test(Hhead,m); /*在插入新元素后,检验并处理单链表中第m行开始的元素,使其满足规则*/}/*对控制键进行响应,A:按键的整数值,Hhead:行单链表的首地址*/void control(int A, Hnode *Hhead){void colorview(Hnode *,int,int); /*函数声明*/int x,y,flag=0;x=wherex(); y=wherey(); /*得到当前光标的坐标值*/if((A==CL)&&(x!=1)) /*ctrl+←,当前光标不是在行首,光标移动*/gotoxy(wherex()-1,wherey());if((A==CL)&&(x==1)) /*ctrl+←,在行首*/gotoxy(abs(judge(Hhead,wherey()-1)),wherey()-1);/*judge(Hhead,wherey()-1)上一行的字符个数作为x值,光标移动*/if((A==CR)&&check(Hhead,wherey(),wherex())>0) /*ctrl+→,当前光标的右边有字符,光标移动*/{flag=1;gotoxy(wherex()+1,wherey());}if((A==CR)&&check(Hhead,wherey()+1,1)>0&&check(Hhead,y,x)==0) /*ctrl+→,当前光标处没有字符但下一行的第一列有字符,光标移动*/ {flag=1; gotoxy(1,wherey()+1);}if((A==CR)&&x==76) /*ctrl+→,当前光标在当前行的行尾,光标移动*/{flag=1; gotoxy(1,wherey()+1);}if(A==CR&&flag==1) /*ctrl+→,光标已经跳至新处,将当前光标所在位置的字符的坐标和值保存在r数组中*/{r[abs(value)].col=wherex();r[abs(value)].line=wherey();r[abs(value)].ch=check(Hhead,r[abs(value)].line,r[abs(value)]. col);if(r[abs(value)].ch==-1) r[abs(value)].ch=13; /*若第line行,第col列的字符为回车键,则返回-1*/ value--;}if(A==CL&&(x!=1||y!=1)) /*ctrl+←,当前光标并不在窗口左上角,将当前光标所在位置的字符的坐标和值保存在r数组中*/ {r[abs(value)].col=wherex();r[abs(value)].line=wherey();r[abs(value)].ch=check(Hhead,r[abs(value)].line,r[abs(value)]. col);value++;}colorview(Hhead,wherex(),wherey());}/*用不同的前背景色显示选择的字符*/void colorview(Hnode *Hhead,int x,int y){int i;view(Hhead);/*重新显示所有文本字符*/for(i=0;i<="" bdsfid="442" p="">{gotoxy(r[i].col,r[i].line);textbackground(7);textcolor(0);if(r[i].ch!=13&&r[i].ch!=-1)cprintf("%c",r[i].ch);if(r[i].ch==13||r[i].ch==-1)cprintf(" ");}gotoxy(x,y);}void drawmenu(int m,int n) /*画菜单,m:第几项菜单,n:第m 项的第n个子菜单*/{int i;if(m%3==0) /*画File菜单项*/{window(8,2,19,9);textcolor(0);textbackground(7);for(i=0;i<7;i++) /*在上面定义的文本窗口中先输出7个空行*/ {gotoxy(1,1+i);insline();}window(1,1,80,25);gotoxy(7,1);for(i=1;i<=7;i++){gotoxy(8,1+i);cprintf("%c",179); /*窗口内文本的输出函数,在窗口左边输出| */ gotoxy(19,1+i);cprintf("%c",179); /*窗口内文本的输出函数,在窗口右边输出| */ }for(i=1;i<=11;i++){gotoxy(8+i,2);cprintf("%c",196); /*窗口内文本的输出函数,在窗口上边输出- */ gotoxy(8+i,9);cprintf("%c",196); /*窗口内文本的输出函数,在窗口下边输出- */ }textbackground(0);gotoxy(10,10); cprintf(" "); /*输出下边的阴影效果*/for(i=0;i<9;i++){gotoxy(20,2+i);cprintf(" "); /*输出右边的阴影效果*/}/*以上为显示菜单项的外观*/textbackground(7);gotoxy(8,2); cprintf("%c",218); /*输出四个边角表格符*/gotoxy(8,9); cprintf("%c",192);gotoxy(19,2); cprintf("%c",191);gotoxy(19,9); cprintf("%c",217);gotoxy(9,3); cprintf(" New ");gotoxy(9,4); cprintf(" Open ");gotoxy(9,5); cprintf(" Save ");gotoxy(9,6); cprintf(" Save as");for(i=1;i<=10;i++){gotoxy(8+i,7);cprintf("%c",196); /*在Save as下输出一行分隔符*/}gotoxy(9,8); cprintf(" Exit");textcolor(15); textbackground(0);gotoxy(7,1);cprintf("%c %c File %c %c",179,17,16,179);switch(n%5){case 0:gotoxy(9,3); cprintf(" New "); break;case 1:gotoxy(9,4); cprintf(" Open "); break;case 2:gotoxy(9,5); cprintf(" Save "); break;case 3:gotoxy(9,6); cprintf(" Save as "); break;case 4:gotoxy(9,8); cprintf(" Exit "); break;}}/********************************************************/ if(m%3==1) /*画Edit菜单项*/{window(28,2,38,7);textcolor(0);textbackground(7);for(i=0;i<5;i++){gotoxy(1,1+i);insline();}window(1,1,80,25);gotoxy(27,1);for(i=1;i<=5;i++){gotoxy(28,1+i);cprintf("%c",179);gotoxy(39,1+i);cprintf("%c",179);}for(i=1;i<=11;i++){gotoxy(28+i,2);cprintf("%c",196);gotoxy(28+i,7);cprintf("%c",196);}textbackground(0);gotoxy(30,8); cprintf(" ");for(i=0;i<7;i++){gotoxy(40,2+i);cprintf(" ");}textbackground(7);gotoxy(28,2); cprintf("%c",218);gotoxy(28,7); cprintf("%c",192);gotoxy(39,2); cprintf("%c",191);gotoxy(39,7); cprintf("%c",217);gotoxy(29,3); cprintf(" Cut ");gotoxy(29,4); cprintf(" Copy ");gotoxy(29,5); cprintf(" Paste ");gotoxy(29,6); cprintf(" Clear ");textcolor(15); textbackground(0);gotoxy(27,1);cprintf("%c %c Edit %c %c",179,17,16,179);switch(n%4){case 0:gotoxy(29,3); cprintf(" Cut "); break;case 1:gotoxy(29,4); cprintf(" Copy "); break;case 2:gotoxy(29,5); cprintf(" Paste "); break;case 3:gotoxy(29,6); cprintf(" Clear "); break;}}/*********************************************************/ if(m%3==2) /*画Help菜单项3*/{window(48,2,48,6);textcolor(0);textbackground(7);for(i=0;i<3;i++){gotoxy(1,1+i);insline();}window(1,1,80,25);gotoxy(47,1);for(i=1;i<=5;i++){gotoxy(48,1+i);cprintf("%c",179);gotoxy(59,1+i);cprintf("%c",179);}for(i=1;i<=11;i++){gotoxy(48+i,2);cprintf("%c",196);gotoxy(48+i,6);cprintf("%c",196);}textbackground(0);gotoxy(50,7); cprintf(" ");for(i=0;i<6;i++){gotoxy(60,2+i);cprintf(" ");}textbackground(7);gotoxy(48,2); cprintf("%c",218); gotoxy(48,6); cprintf("%c",192); gotoxy(59,2); cprintf("%c",191); gotoxy(59,6); cprintf("%c",217); gotoxy(49,3); cprintf("Help... "); gotoxy(49,5); cprintf("About... "); for(i=1;i<=10;i++)gotoxy(48+i,4);cprintf("%c",196);}textcolor(15); textbackground(0);gotoxy(47,1);cprintf("%c %c Help %c %c",179,17,16,179);switch(n%2){case 0:gotoxy(49,3); cprintf("Help... "); break;case 1:gotoxy(49,5); cprintf("About... "); break;}}}int menuctrl(Hnode *Hhead,int A) /*菜单控制*/{int x,y,i,B,value,flag=100,a,b;x=wherex(); y=wherey();if(A==F1) { drawmenu(0,flag); value=300; } /*显示File及其子菜单,并将光带显示在第一个子菜单上*/if(A==F2) { drawmenu(1,flag); value=301; } /*显示Edit及其子菜单,并将光带显示在第一个子菜单上*/if(A==F3) { drawmenu(2,flag); value=302; } /*显示Help及其子菜单,并将光带显示在第一个子菜单上*/if(A==F1||A==F2||A==F3){while((B=bioskey(0))!=ESC) /*选择用户按键*/if(flag==0) flag=100;if(value==0) value=300; /*此value为局部变量*/if(B==UP) drawmenu(value,--flag); /*循环上下移*/if(B==DOWN) drawmenu(value,++flag); /*循环上下移*/ if(B==LEFT) /*菜单项之间循环选择(左移)*/{flag=100;drawmain();window(2,2,79,23);textbackground(9);for(i=0;i<24;i++)insline();window(3,3,78,23);textcolor(10);view(Hhead);drawmenu(--value,flag);}if(B==RIGHT)/*菜单项之间循环选择(右移)*/{flag=100;drawmain();window(2,2,79,23);textbackground(9);for(i=0;i<24;i++)insline();window(3,3,78,23);textcolor(10);view(Hhead);drawmenu(++value,flag);if(B==ENTER) /*选中某主菜单项的子菜单项(选中某项)*/ {if(value%3==0) b=5; /*File下有5个子菜单项*/if(value%3==1) b=4; /*Edit下有4个子菜单项*/if(value%3==2) b=2; /*Help下有2个子菜单项*/a=(value%3)*10+flag%b;/*a表示选择子菜单的编号*/ drawmain();window(2,2,79,23);textbackground(9);for(i=0;i<24;i++)insline();window(3,3,78,23);textcolor(10);view(Hhead);gotoxy(x,y);if(a==0) return 100; /*New*/if(a==1) return 101; /*Open*/if(a==2) return 102; /*Save*/if(a==3) return 103; /*Save As*/if(a==4) exit(0); /*Exit*/if(a==10) return Cx; /*Cut*/if(a==11) return Cc; /*Copy*/if(a==12) return Cv; /*Paste*/if(a==13) return DEL;/*Clear*/if(a==20) return 120; /*Help... */if(a==21) return 121; /*About...*/}gotoxy(x+2,y+2);}/*若按键非F1、F2、F3*/drawmain();window(2,2,79,23);textbackground(9);for(i=0;i<24;i++)insline();window(3,3,78,23);textcolor(10);view(Hhead);gotoxy(x,y);}return A;}/*将head所指的行单链表中所指的各个列单链表中的数据域的值写入文件,文件路径和文件名由用户指定*/void save(Hnode *head){FILE* fp;Hnode *q;node *p;I nt count=0,x,y;char filename[10]; /*保存文件名*/q=head;clrscr();/*清屏*/printf("Enter infile name,for example [c:\\\\wb.txt]:");/*输入文件名格式*/scanf("%s",filename); /*输入文件名*/fp=fopen(filename,"w");if(fp==NULL) /*打开文件失败*/{printf("\=====>open file error!\");getchar();return ;}do{p=q->next; /*指向node类型的数据*/while(p!=NULL){if((int)p->ch==13){fputc('\',fp);p=p->next; count++;}else{fputc(p->ch, fp);p=p->next;count++;}}q=q->nextl;}while(q!=NULL);fclose(fp); /*关闭此文件*/return ;}/*文件另存为:将head所指的行单链表中所指的各个列单链表中的数据域的值写入文件,文件路径和文件名由用户指定*/ void saveas(Hnode *head){FILE* fp;Hnode *q;node *p;int count=0,x,y;char filename[10]; /*保存文件名*/q=head;clrscr();/*清屏*/printf("Enter infile name,for example [c:\\\\wb.txt]:");/*输入文件名格式*/scanf("%s",filename); /*输入文件名*/fp=fopen(filename,"w");if(fp==NULL) /*打开文件失败*/{printf("\=====>open file error!\");getchar();return ;}do{p=q->next; /*指向node类型的数据*/while(p!=NULL){if((int)p->ch==13){fputc('\',fp);p=p->next; count++;}else{fputc(p->ch, fp);p=p->next;count++;}}q=q->nextl;}while(q!=NULL);fclose(fp); /*关闭此文件*/return ;}/*从任意文本文件中读取文件内容,保存至行单链表和列单链表形式的数据结构中*/ void opens(Hnode *Hp){FILE* fp;Hnode *q11,*q22;node *p11,*p22,*hp;char temp;int count=0,flags=1;char filename[10]; /*保存文件名*/clrscr();/*清屏*/printf("Enter infile name,for example [c:\\\\wb.txt]:");/*输入文件名格式*/scanf("%s",filename); /*输入文件名*/fp=fopen(filename,"r");/*以只读方式打开文件,filename必须要存在*/if(fp==NULL)/*打开文件失败*/{textbackground(2);textcolor(13);cprintf("open file error!");getchar();exit(0) ;}q11=Hp;while(!feof(fp)){count=0;flags=1;q22=(Hnode *)malloc(sizeof(Hnode));/*新建一个行单链表中的节点*/p11=(node *)malloc(sizeof(node)); /*新建一个列单链表中的节点*/while((temp=fgetc(fp))!=10&&count<=76&&!feof(fp)) /*循环结束,表示在单链表中一行处理完毕,开始新行*/ {p22=(node *)malloc(sizeof(node));/*新建一个列单链表中的节点*/if(flags==1) {hp=p22;flags=0;} /*hp保存列单链表中的首节点的地址*/p22->ch=temp; p22->next=NULL;p11->next=p22; p11=p22;count++;}if(temp==10) /*若为换行符,将其转换为回车符,因为在程序中,是按回车符处理的*/{p22=(node *)malloc(sizeof(node));p22->ch=13; p22->next=NULL;p11->next=p22; p11=p22;}if(!feof(fp))/*若没此条件,文件最后一行会处理两次.*/{q22->next=hp;q22->nextl=NULL; /*将存储了字符的新列单链表与行单链表中的新节点建立关联*/q11->nextl=q22;q11=q22;}}fclose(fp);Hp=Hp->nextl;/*因为Hp的所在节点的数据域为空,所以Hp=Hp->nextl*/return ;}。

简单文本编辑器

简单文本编辑器

简单文本编辑器(C++)一、功能要求1、具有图形菜单界面;2、查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除3、可正确存盘、取盘;4、正确显示总行数。

二、主程序流程图三、数据结构程序中用链表来保存文本,每一行为一个单向链表,每一行的表头保存在一个行链表中,形成了一个2维链表,结构如下图所示:四、功能实现1. 打开文件(1) 提示用户输入文件路径(2) 判断文件路径是否有效,若无效,则提示错误信息并返回,否则继续执行。

(3) 若文件成功打开并且文件指针没有到文件尾,则从文件中一次读取一个字符,并将该字符添加到一列单链表节点中,直至遇到换行符(ASCII 码10)。

当列单链表形成后,它的首地址将被保存至行单链表的相应节点的数据域中,如此动作,直至文件指针指向文件尾部而结束。

2. 新建文件(1) 若行链表中有数据存在,则提示用户保存文件。

(2) 提示用户输入新建文件的保存路径。

(3) 测试新文件路径是否有效。

3. 保存文件(1) 打开文件。

(2) 遍历行单链表,遍历行单链表节点指向的列单链表,并将数据输出到文件,每个列单链表遍历完后,输出换行符到文件。

(3) 关闭文件4. 插入字符串(1) 提示用户输入要插入字符串的位置(行号row ,列号col )以及要插入的字符串。

(2) 先在行单链表中找到该行(第row 行),若超出现有行数,则添加空行补齐;(3) 将字符串插入该行(第row 行)节点指向的列链表中的col-1位置,若超出现有节行链表表头行2行1行3行4点数,则添加保存字符为空格的节点补齐。

5.删除字符串(1)提示用户输入要删除字符串的开始位置(行号row,列号col)以及要插入的字符串的长度len。

(2)在链表中定位到该行节点,若不存在,则提示无法删除并返回;否则继续执行。

(3)在该行中定位到该col字符节点node,若不存在,则提示无法删除并返回;否则继续执行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课题46:简易文本编辑器(2人)。

要求:1) 具有图形菜单界面;2) 查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除;3) 可正确存盘、取盘;4) 正确显示总行数。

#include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>#define MAX 10000#define _CRT_SECURE_NO_DEPRECATE //在vs中取消warning的警告void menu();void shuru(char text[]);void bc(char text[]);void dakai(char text[]);void dayin(char text[]);void chazhao(char text[],int l);void tihan(char text[],int l);int strindex(char text[],char t[],int i2,int l);void shanchu(char p[],int l);void cs(char text[]);void charu(char text[],int l);void tuichu(int status);char text[MAX]=""; //文本编辑域char name[20]=""; //文件保存的位置int status=0; //显示是否保存过的状态int ntext; //文本编辑的位置void dakai(char text[]){system("cls");FILE *fp;char pd,ch;char name[30];int i=0;printf("输入A:确定打开文件(未保存的数据将会丢失) M:返回主菜单");fflush(stdin);pd=getchar();if (pd=='A'||pd=='a'){printf("请输入要打开文件名字(例如c:\\a.txt)");scanf("%s",name);while ((fp=fopen(name,"r"))==NULL){printf("\n打开文件失败,请重新输入要打开的文件名:");scanf("%s",name);}cs(text);while(!feof(fp)){ch=fgetc(fp);text[i]=ch;i ;}text[i]='\0';ntext=i;fclose(fp);printf("\n文件读取成功\n文件内容为\n");dayin(text);}if (pd=='M'||pd=='m')menu();}void bc(char text[]){system("cls");FILE *fp;char pd;char tmp;int i;printf("\n输入【A】保存;任意键返回主菜单不保存\n");fflush(stdin);pd=getchar();if (!(pd=='A'||pd=='a')){menu();}else{if(name[20]==NULL){printf("\n请输入保存文件名(例如: c:\\a.txt):");scanf("%s",name);}while ((fp=fopen(name,"w "))==NULL){printf("文件不存在,请重新输入文件名:");scanf("%s",name);}printf("\nA:确定;B:取消:");while(scanf("%c",&tmp)!=EOF){if (tmp=='A' || tmp=='a'){for(i=0;i<ntext;i )fprintf(fp,"%c",text[i]);fclose(fp);status=1;printf("\n文件保存成功\n");break;}if (tmp=='B' || tmp=='b'){break;}}}}void cs(char text[]){int i;for (i=0;i<ntext;i ){text[i]='\0';}ntext=0;status=0;}int strindex(char text[],char t[],int i2,int l) //查找要操作的数据的位置(模式匹配){int i1=l,j=0;while (i1<ntext&&j<i2){if (text[i1]==t[j]) //继续匹配下一个字符{j ;i1 ;//主串和子串依次匹配下一个字符}else //主串、子串指针回溯重新开始下一次匹配{i1=i1-j 1; //主串从下一个位置开始匹配j=0;//子串从头开始匹配}}if (j>=i2){return(i1-i2);} //返回匹配的第一个字符的下标elsereturn(-1); //模式匹配不成功}void menu(){system("cls");time_t timep;time (&timep);printf("%s",ctime(&timep));printf("\n\n\n\n\n\n\n\n\n\t\t\tWelcom to use our TXT edition system!\n");printf("\n\n\t\t\t 欢迎您使用文本编辑器软件!\n");printf("\n\n\n\n\n\n\n\n\npress Enter to continue...\n");getchar();loop:system("cls");printf("\n\n\n\n\t\t******************简易文本编辑器*****************\n\n");printf("\t\t\t\t----0.清空内容--\n");printf("\t\t\t\t----1.打开文件--\n");if (ntext==0){printf("\t\t\t\t----2.输入内容--\n");}else {printf("\t\t\t\t----2.继续输入--\n");}printf("\t\t\t\t----3.查找------\n");printf("\t\t\t\t----4.插入------\n");printf("\t\t\t\t----5.删除------\n");printf("\t\t\t\t----6.替换------\n");printf("\t\t\t\t----7.显示内容--\n");printf("\t\t\t\t----8.保存------\n");printf("\t\t\t\t----9.退出------\n");printf("\n\t\t*********************选项************************\n");printf("\n\t\t\t\t输入选项0-9:");char n;fflush(stdin);n=getchar();if(n>='0'&&n<='9'){switch (n){case '0': cs(text);break;case '1': dakai(text);break;case '2': shuru(text);break;case '3': chazhao(text,0);break;case '4': charu(text,1);break;case '5': shanchu(text,0);break;case '6': tihan(text,0);break;case '7': dayin(text);break;case '8': bc(text);break;case '9': tuichu(status);default : break;}}else{printf("\n输入有误,请重新输入:");fflush(stdin);n=getchar();}system("pause");goto loop;}void chazhao(char text[],int l){system("cls");int i,t,a=-1;char pattern[20],bd,pd;printf("原文为:\n");dayin(text);printf("请输入您要查找的内容");scanf("%s",pattern);printf("您查找的内容是:%s\n",pattern);t=strlen(pattern);loop:a=strindex(text,pattern,t,l);if (a!=-1){l=a t;}int hs=1,ls=0;for (i=0;i<=a;i ){ls ;if (text[i]=='\n'){hs ;ls=0;}}if (a==-1){printf("查找到结尾没有找到\n输入R将重头查找;任意键返回主菜单");l=0;fflush(stdin);pd=getchar();}else{printf("已经找到在第%d行第%d列,输入R继续查找下一处;任意键返回主菜单",hs,ls);fflush(stdin);bd=getchar();if (bd=='R'||bd=='r')goto loop;}if (pd=='R'||pd=='r'){l=0;chazhao(text,l);}}void dayin(char text[]){system("cls");printf("现在文本的内容为:\n");printf("%s\n",text);int hs=1,i;for (i=0;i<ntext;i ){if (text[i]=='\n'){hs ;}}printf("\n文本共有%d行\n",hs);}void shuru(char text[]){system("cls");printf("请输入内容(输入@结束输入并返回主菜单):\n");printf("%s",text);char c;int i=ntext,j=ntext;fflush(stdin);while ((c=getchar())!='@'){text[i]=c;i ;ntext=i;continue;}int cout=0,zf=0,h=1,hs=1,zfs=0;for(;cout<ntext;cout ){zf ;if(text[cout]=='\n'){h ;zf--;}if(text[cout]==' ')zf--;}for(cout=j;cout<ntext;cout ){zfs ;if(text[cout]=='\n'){hs ;zfs--;}if(text[cout]==' ')zfs--;}printf("统计:文本一共有%d个字符,%d行,本次输入了%d个字符,%d行\n",zf,h,zfs,hs);}void shanchu(char p[],int l){int i,a=-1,t2=0;char x[20],px,pd,pdx,c;system("cls");printf("%s",p);printf("\n输入【A】执行查找删除内容;任意键返回主菜单:");fflush(stdin);px=getchar();if (px=='a'||px=='A'){printf("\n输入您要删除的内容,以@结束:");fflush(stdin);while ((c=getchar())!='@'){if (c=='@'){break;}else{x[t2]=c;t2 ;continue;}}loop:a=strindex(p,x,t2,l);int hs=1,ls=0;for (i=0;i<=a;i ){ls ;if (p[i]=='\n'){hs ; ls=0;}}if (a==-1){printf("已查找结束,您要删除的内容不存在\n输入【R】重新输入要删除的内容;其他键将返回主菜单:");l=0;fflush(stdin);pdx=getchar();}else{printf("你要删除的内容在第%d行第%d列\n 输入【A】确定删除;输入【B】寻找下个词;其他键将返回主菜单:",hs,ls);fflush(stdin);pd=getchar();l=t2 a;if (pd=='a'||pd=='A'){for(i=a;i<ntext;i ){p[i]=p[i t2];}ntext=ntext-t2;printf("删除成功,删除后的内容为:\n%s\n",text);}else if (pd=='b'||pd=='B')goto loop;}if(pdx=='r'||pdx=='R')shanchu(text,l);}}void charu(char text[],int l) //向文本中插入内容{system("cls");int i=0,t=0,t2=0,a=-1,b;char cr[20]="",pd,x[500],c,d;printf("\n当前文本信息为:\n");printf("%s",text);printf("\n输入您要在哪个内容前插入,以@结束:");fflush(stdin);while ((c=getchar())!='@') //用一个数组接收要插入在哪个内容之前{if (c=='@'){break;}else{cr[t]=c;t ;continue;}}loop:a=strindex(text,cr,t,l); //查找并返回要插入的位置点int hs=1,ls=0;for (b=0;b<a;b ){ls ;if (text[b]=='\n'){hs ;ls=0;}}if (a==-1){printf("\n查找到结尾没有找到插入点,输入【R】查找其他;按其他键返回菜单:\n");l=0;fflush(stdin);d=getchar();fflush(stdin);}else{printf("\n您要插入的位置是第%d行,第%d列之前\n【A】.不是此位置向后继续找插入点\n【B】.在此位置插入\n按其他键返回菜单\n请选择:",hs,ls 1);fflush(stdin);pd=getchar();if (pd=='a'||pd=='A'){l=a t;goto loop;}else if (pd=='b'||pd=='B'){printf("\n\n输入您要插入的内容,以@结束:");fflush(stdin);while ((c=getchar())!='@'){if (c=='@'){break;}else{x[t2]=c;t2 ;continue;}}for (i=ntext;i>=a;i--){text[i t2]=text[i];}for (i=0;i<t2;i ){text[i a]=x[i];}ntext=ntext t2;printf("\n当前文本信息为:\n");for (i=0;i<=ntext-1;i )printf("%c",text[i]);printf("\n文本插入成功\n");fflush(stdin);getchar();}}if (d=='r'||d=='R'){l=0;charu(text,l);}status=0;}void tihan(char p[],int l) //内容替换{int t=0,t1=0,i,a,b;char c,th[20],d,d1,bth[20];int i2;system("cls");printf("\n当前文本信息为:\n");for (i2=0;i2<=ntext-1;i2 )printf("%c",p[i2]);printf("\n输入要被替换的内容,以@结束:");fflush(stdin);while ((c=getchar())!='@') //t指替换前内容的长度{if (c=='@'){break;}else{bth[t]=c;t ;continue;}}loop:a=strindex(p,bth,t,l); //查找要被替换的内容的位置int hs=1,ls=0;for (b=0;b<a;b ){ls ;if (p[b]=='\n'){hs ;ls=0;}}if (a==-1){printf("\n查找到结尾没有找到要被替换的内容\n输入【R】查找其他内容,按其他键返回主菜单键\n");l=0;d=getchar();fflush(stdin);}else{printf("\n\n已经找到要查找的数据在第%d行第%d列\n输入【A】继续向后查找相同内容\n输入其他键将进行替换操作\n请选择:",hs,ls 1);fflush(stdin);l=t a;char pd;pd=getchar();if (pd!='a'&&pd!='A'){printf("\n是否要替换该内容?\nA:替换给内容;其他键返回主菜单\n请选择:");fflush(stdin);d1=getchar();if (d1=='a'||d1=='A'){printf("\n输入要替换的内容,以@结束:");fflush(stdin);while ((c=getchar())!='@') //t1指替换后的内容长度{if (c=='@'){break;}else{th[t1]=c;t1 ;continue;}}if (t==t1) //将要被替换的内容和替换后的内容进行长度比较{for (i=0;i<t1;i )p[i a]=th[i];}else{if (t>t1){for (i=0;i<t1;i ){p[i a]=th[i];}for (i=a t1;i<ntext;i ){p[i]=p[i t-t1];}ntext=ntext t1-t;}else{for (i=ntext;i>=a;i--){p[i t1-t]=p[i];}for (i=0;i<t1;i ){p[i a]=th[i];}ntext=ntext t1-t;}}printf("替换成功");printf("\n当前文本信息为:\n");for (i2=0;i2<=ntext-1;i2 )printf("%c",p[i2]);getchar();status=0;}}elsegoto loop;}if(d=='r'||d=='R')tihan(text,l);}void tuichu(int status){char pd;if(status)exit(0);elseprintf("还未保存文件,确定退出?(Q.直接退出;Y.保存后退出");fflush(stdin);pd=getchar();if(!(pd=='Q'||pd=='q'))bc(text);exit(0);}int main(){menu();return (0);}。

相关文档
最新文档