文本编辑器C代码
- 格式:doc
- 大小:130.50 KB
- 文档页数:26
#include<iostream>#include<string>using namespace std;int *get_next(char*T,int*next);//声明get_next函数以获取next数组int KMP(char*S,char*T);//声明KMP函数调用next函数来进行查找int get_choice();//选择要执行的功能void serach(string S);//定义查找函数void add_char(string &S);//定义添加函数void change(string &S);//定义替换函数void delete_char(string &S);//定义删除函数void display(string &S);//显示函数,用于显示当前的字符串int *get_next(const char*T,int *next){int i = 0,j = -1;int length = strlen(T); //根据T字符串将所得到的next数组值存在next指针指向数组中int *temp = next;*next = -1;while(i < length){if(j == -1||*(T+i)){i++;//如果字符串中第i个字符与从头起第j个相同,则i,j分别向后移一位j++;if(*(T+i)!=*(T+j))*(next+i) = j;//当遇到第一个不相同的字符时,当前的j值就是next数组第i个元素的值else*(next+i) = *(next+j);//如果相同,则从字符串开始第j个元素的next值与当前位置的值相同}elsej = *(next+j);//如果遇到第i个元素和从头起的第j个元素不相同,则从第j个元素的next值的位置回溯}return temp;}int KMP(string S,string T){int S_Length = S.length();int T_Length = T.length();if(S_Length < T_Length)return 0;//如果目标串比要查找的串要短,直接返回失败int i = 0,j = 0;int *next = new int[T_Length];get_next(T.c_str(),next);while(i < S_Length && j < T_Length){if(j == -1||*(S.c_str()+i) == *(T.c_str()+j)){i++;//如果对应i,j元素相同,则依次向后错一位j++;}elsej = *(next+j);//否则通关next函数,将j指针回溯一定距离}if(j >= T_Length)return i-T_Length+1;//当j==T_Length时,意味查找成功,返回开始字符所在的位置elsereturn 0;//否则返回失败}int get_choice(){//获取用户输入的选项,以进行相应操作int temp;cout<<"请输入你即将执行的操作:\n1——查找\t2——添加\t3——替换\n4——删除\t5——显示当前字符串\t6——退出\n你的选择:"<<endl;while(1){cin>>temp;if(temp < 7 && temp > 0)//只有输入1-6时才返回输入的选项return temp;else{cout<<"你的输入有误,请重新输入\n你的选择:";}}}void serach(string S){int k;string T;cout<<"请输入要查找的串:";cin.sync();//清空缓存区,否则将自动读入输入选项时候按下的回车键getline(cin,T);if(k = KMP(S,T))//KMP的返回值不为0即查找成功时候,if条件判断认为是真cout<<"所要查找的字符串从第"<< k <<"个字符开始"<<endl;elsecout<<"查找失败!"<<endl;}void add_char(string &S){int k;string m;cout<<"请输入你想插入的位置";while(1){cin>>k;if(k >= 0 && k <= S.length())//插入的位置不能再字符串外面break;elsecout<<"你输入的位置有误,请重新输入你想插入的位置:";}cout<<"请输入你要插入的字符串:";cin.sync();//清空缓存区,否则将自动读入输入选项时候按下的回车键getline(cin,m);S=S.insert(k,m);//将字符串m插到S的第k个位置上}void change(string &S){//调用String类将第K个字符到第m个字符替换为新字符串的函数int k,m;string temp;cout<<"请输入由第几个字符开始替换:";while(1){cin>>k;if(k < S.length() && k >=0)//起始位置必须小于字符串长度{cout<<"替换至第几个字符:";while(1){cin>>m;if(m <= S.length() && m>k)//结尾位置必须不大于字符串长度且不小于起始位置break;elsecout<<"输入有误,请重新输入结尾:";}break;}elsecout<<"输入有误,请重新输入开头:";}cout<<"请输入要替换成的字符串:";cin.sync();getline(cin,temp);S.replace(k,m,temp);//将目标串替换至指定位置}void delete_char(string &S){int k,m;cout<<"请输入从第几个字符开始删除:";while(1){cin>>k;if(k < S.length() && k >= 0)//如果k==S.length(),则下面无法删除0个{cout<<"删除的字符个数为:";while(1){cin>>m;if((k+m) <= S.length() && m > 0)//删除的最后一个字符不能超出字符串的长度break;elsecout<<"输入有误,请重新输入个数:";}break;}elsecout<<"输入有误,请重新输入开始位置:";}S=S.erase(k,m);}void display(string &S){cout<<"当前字符串为:"<<endl;cout<<S.data()<<endl;}void main(){int choice;string S;cout<<"请输入一个字符串:"<<endl;getline(cin,S);while(1){choice = get_choice();switch(choice){case 1:serach(S);break;case 2:add_char(S);break;case 3:change(S);break;case 4:delete_char(S);break;case 5:display(S);break;default:exit(0);}}}。
用C#编写“文本编辑器”实验报告实验3 项目名称:文本编辑器1、实验目的和要求通过本实验,使得学生理解操作系统目录与文件的概念,掌握文件流的读写操作。
要求编写一个满足以下条件的文本编辑器程序。
(1)程序界面与操作系统中的记事本界面类似。
(2)程序可以打开、保存和编辑txt文本文件。
(3)程序可以查找和替换文本内容中的指定字符串2、程序代码using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace 记事本{public partial class frmNotepad : Form{bool b = false;//布尔变量b用于判断文件是新建的还是从磁盘打开。
true表示文件从磁盘打开的,false表示文件是新建的,默认值为falsebool s = true;//布尔变量s用于判断文件是否被保存。
false表示未被保存,默认值为truepublic frmNotepad(){InitializeComponent();}/*多格式文本框TextChange的事件代码*/private void rtxtNotepad_TextChanged(object sender, EventArgs e){//文本被修改后,设置s为false,表示文件未被保存s = false;}/*【新建】菜单代码*/private void tsmiNew_Click(object sender, EventArgs e){//判断当前文件是否从磁盘打开,或者新建时文档不为空,并且文件未被保存if (b == true || rtxtNotepad.Text.Trim() != ""){//若文件未被保存if (s == false){string result;result = MessageBox.Show("文件尚未保存,是否保存?", "保存文件", MessageBoxButtons.YesNoCancel).ToString();switch (result){case "Yes"://若文件是从磁盘打开的if (b == true){//按文件打开的路径保存文件rtxtNotepad.SaveFile(odlgNotepad.FileName);}//若文件不是从磁盘打开的else if (sdlgNotepad.ShowDialog() == DialogResult.OK){rtxtNotepad.SaveFile(sdlgNotepad.FileName);}s = true;rtxtNotepad.Text = "";break;case "No":b = false;rtxtNotepad.Text = "";break;}}}}/*【打开】菜单代码*/private void tsmiOpen_Click(object sender, EventArgs e){if (b == true || rtxtNotepad.Text.Trim() != ""){string result;result = MessageBox.Show("文件尚未保存,是否保存?", "保存文件", MessageBoxButtons.YesNoCancel).ToString();switch (result){case "Yes":if (b == true){rtxtNotepad.SaveFile(odlgNotepad.FileName);}else if (sdlgNotepad.ShowDialog() == DialogResult.OK){rtxtNotepad.SaveFile(sdlgNotepad.FileName);}s = true;rtxtNotepad.Text = "";break;case "No":b = false;rtxtNotepad.Text = "";break;}}odlgNotepad.RestoreDirectory = true;if ((odlgNotepad.ShowDialog() == DialogResult.OK) && odlgNotepad.FileName != ""){rtxtNotepad.LoadFile(odlgNotepad.FileName);b = true;}s = true;}/*【保存】菜单代码*/private void tsmiSave_Click(object sender, EventArgs e){//若文件从磁盘打开并且修改了其内容if (b == true && rtxtNotepad.Modified == true){rtxtNotepad.SaveFile(odlgNotepad.FileName);s = true;}else if (b == false && rtxtNotepad.Text.Trim() != "" && sdlgNotepad.ShowDialog() == DialogResult.OK){rtxtNotepad.SaveFile(sdlgNotepad.FileName);s = true;b = true;odlgNotepad.FileName = sdlgNotepad.FileName;}}/*【另存为】菜单代码*/private void tsmiSaveAs_Click(object sender, EventArgs e)if (sdlgNotepad.ShowDialog() == DialogResult.OK){rtxtNotepad.SaveFile(sdlgNotepad.FileName);s = true;}}/*【退出】菜单代码*/private void tsmiClose_Click(object sender, EventArgs e){Application.Exit();}//【撤销】菜单代码private void tsmiUndo_Click(object sender, EventArgs e){rtxtNotepad.Undo();}//【复制】菜单代码private void tsmiCopy_Click(object sender, EventArgs e){rtxtNotepad.Copy();}//【剪切】菜单代码private void tsmiCut_Click(object sender, EventArgs e){rtxtNotepad.Cut();}//【粘贴】菜单代码private void tsmiPaste_Click(object sender, EventArgs e){rtxtNotepad.Paste();}//【全选】菜单代码private void tsmiSelectAll_Click(object sender, EventArgs e) {rtxtNotepad.SelectAll();}//【日期】菜单代码private void tsmiDate_Click(object sender, EventArgs e){rtxtNotepad.AppendText(System.DateTime.Now.ToString()); }//【自行换行】菜单代码private void tsmiAuto_Click(object sender, EventArgs e)if (tsmiAuto.Checked == false){tsmiAuto.Checked = true;//选中该菜单项rtxtNotepad.WordWrap = true;//设置为自动换行}else{tsmiAuto.Checked = false;rtxtNotepad.WordWrap = false;}}//【字体】菜单代码private void tsmiFont_Click(object sender, EventArgs e){fdlgNotepad.ShowColor = true;if (fdlgNotepad.ShowDialog() == DialogResult.OK){rtxtNotepad.SelectionColor = fdlgNotepad.Color;rtxtNotepad.SelectionFont = fdlgNotepad.Font;}}//【工具栏】菜单代码private void tsmiToolStrip_Click(object sender, EventArgs e){Point point;if (tsmiToolStrip.Checked == true){point = new Point(0, 25);//隐藏工具栏时,把坐标设为(0,25),因为菜单的高度为24tsmiToolStrip.Checked = false;tlsNotepad.Visible = false;rtxtNotepad.Location = point;//设置多格式文本框左上角的位置rtxtNotepad.Height += tlsNotepad.Height;//隐藏工具栏后,增加文本框的高度}else{//显示工具栏时,多格式文本框左上角的位置为(0,50),因为工具栏的高度25加上菜单的高度25=50point = new Point(0, 50);tsmiToolStrip.Checked = true;tlsNotepad.Visible = true;rtxtNotepad.Location = point;rtxtNotepad.Height -= tlsNotepad.Height;}}//【状态栏】菜单代码private void tsmiStatusStrip_Click(object sender, EventArgs e){if (tsmiStatusStrip.Checked == true){tsmiStatusStrip.Checked = false;stsNotepad.Visible = false;rtxtNotepad.Height += stsNotepad.Height;}else{tsmiStatusStrip.Checked = true;stsNotepad.Visible = true;rtxtNotepad.Height -= stsNotepad.Height;}}//【关于记事本】菜单代码private void tsmiAbout_Click(object sender, EventArgs e){frmAbout ob_FrmAbout = new frmAbout();ob_FrmAbout.Show();}private void tlsNotepad_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {int n;//变量n用来接收按下按钮的索引号n = tlsNotepad.Items.IndexOf(e.ClickedItem);switch (n){case 1:tsmiNew_Click(sender, e);break;case 2:tsmiOpen_Click(sender, e);break;case 3:tsmiSave_Click(sender, e);break;case 4:tsmiCut_Click(sender, e);break;case 5:tsmiCopy_Click(sender, e);break;case 6:tsmiPaste_Click(sender, e);break;case 7:tsmiAbout_Click(sender, e);break;}}//计时器控件代码private void tmrNotepad_Tick(object sender, EventArgs e){tssLbl2.Text = System.DateTime.Now.ToString();}//窗体的sizechanged事件代码(为使得改变窗体大小时,状态栏随之改变)private void frmNotepad_SizeChanged(object sender, EventArgs e){frmNotepad ob_frmNotepad = new frmNotepad();tssLbl1.Width = this.Width / 2 - 12;tssLbl2.Width = tssLbl1.Width;}}}3、实验结果及程序运行界面。
用VC++MFC做文本编辑器(转载)收藏1,首先新建一个工程,选择MFC AppWizard(exe),定名字为:textview_1,程序类型选择单个文档,其他均默认完成。
2,在系统自动生成的CTextview_1Doc类里面增加一个控件,用于文本文档的暂时存放: class CTextview_1Doc : public CDocument public:CStringArray m_strContent;然后在CTextview 1Doc类的Serialize函数里面增加打开、保存文本文件的程序: void CTextview_1Doc::Serialize(CArchive& ar)CStri ng str;if ()) public:CEdit* m_ctrlEdit;该指针成员在类建立时要设置初始化值为NULL,否则运行起来就会出错,如下: CTextview_1View::CTextview_1View() :m_ctrlEdit(NULL) II添加这一行初始化代码II TODO: add con struct ion code here用第2点介绍的类似步骤,为CTextview_1View类重写其Onin itial Up date函数,添加内容如下:void CTextview_1View::OninitialUpdate()CView:: OnIn itialU pdate();// TODO: Add your specialized code here and/or call the base classCRect rcClie nt;GetClientRect( rcClient ); //获取当前视图的客户区大小// if ( m_ctrlEdit ) delete m_ctrlEdit; m_ctrlEdit = new CEdit();m_ctrlEdit->Create( ES_MULTILINE | WS_CHILD | WS_VISIBLE| WS_HSCROLL| ES_AUTOHSCROLL// 自动水平滚动| WS_VSCROLL| ES_AUTOVSCROLL // 自动垂直滚动CTextview_1Doc* pDoc = GetDocument(); //获取与视图相关联的文档指针//以下是将文档中的m_strContent内容全部赋给strCStri ng str;int nLines = (int)pDoc->();for ( int i=0; i<nLines; i++ )str = str + pDoc->( i );str = str + "\r\n"; // 换行m_ctrlEdit->SetTabStops( 16 ); // 设置Tab 符大小m_ctrlEdit->SetWindowText( str ); // 将文档内容传给控件4,现在运行一下,文本编辑器就做好了。
C语言实现文本编辑器本文将介绍使用C语言实现一个简单的文本编辑器的基本原理和实现步骤。
通过此编辑器,用户可以打开、编辑、保存和关闭文本文件,并且具备基本的文本编辑功能,如插入、删除、查找和替换文本等。
一、编辑器界面设计为了实现一个简单易用的文本编辑器,我们可以设计一个基于命令行界面的编辑器。
用户可以通过文本命令来操作编辑器,从而实现基本的编辑功能。
二、文件的打开和保存在C语言中,我们可以使用标准文件操作函数来实现文件的打开和保存。
用户可以通过指定文件路径来打开或保存文件。
打开文件时,程序会读取文件内容,并将其显示在编辑器界面中;保存文件时,程序会将编辑器内的文本内容写入目标文件中。
三、基本文本编辑功能1. 插入文本用户可以使用插入命令将文本内容插入到当前光标位置之前或之后。
程序会根据插入位置的不同,调整光标的位置,并显示插入后的文本内容。
2. 删除文本用户可以使用删除命令删除当前光标位置处的文本内容。
程序会删除光标所在位置的字符,并相应地调整文本的显示和光标的位置。
3. 搜索文本用户可以使用搜索命令来查找特定的文本内容。
程序会从当前光标位置开始搜索,并根据搜索结果将光标移动到匹配文本的位置。
4. 替换文本用户可以使用替换命令将指定的文本内容替换为新的内容。
程序会搜索文本中的所有匹配项,并将其替换为新的内容。
四、其他功能扩展除了基本的文本编辑功能外,我们还可以对编辑器进行功能扩展,以提升用户体验和编辑效率。
一些可能的扩展功能包括:1. 撤销和重做功能:允许用户撤销和重做操作,以便回退或恢复文本编辑的历史记录。
2. 多窗口编辑:支持同时打开和编辑多个文本文件的功能,提供多窗口切换和管理。
3. 自动保存与恢复:定时自动保存编辑的文本内容,并在下次启动时自动恢复上次编辑的状态。
4. 语法高亮:根据文本类型,对关键字、注释、字符串等进行特殊标记显示,提升代码可读性。
五、总结通过使用C语言,我们可以实现一个简单但功能完善的文本编辑器。
C语言实现简易文本编译器数据结构课程设计之简易文本编译器(C语言实现)需求分析(1)具有图形菜单界面:显示实时年份,日期,星期及时间(2)查找:查找文本中的字符串,显示其出现的行数,列数及总共出现次数替换(等长,不等长):对文本中的文本实现等长及不等长替换插入(插串,文本块的插入):插入一行或在具体行号列号处插入文本块移动(行块,列块移动):向下移动一行,向上移动一行,具体行号列号处向左移动或向右移动删除:删除一行,删除莫一行,莫列,定长的内容(3)可正确存盘、取盘;:可读取,保存文本;(4)正确显示总行数。
(行数不少于5行,每行字符数不少于80个字符)采用的数据结构1:采用的逻辑结构文本编辑器主要是针对文本进行编辑,文本的操作就是对字符的操作。
文本编辑器可以从行、列两个方向进行编辑。
每一行可以看成一个线性表,线性表是一种线性结构,线性结构的特点是数据元素之间为线性关系,据元素“一个接一个的排列”。
在一个线性表中数据元素的类型是相同的,由于每一行可以存储的最大字数是相同的,行方向所有线性表的最大长度可以设置成相同的。
行与行之间的关系也可以看成一个线性表。
2.采用的存储结构线性表的存储分为两种:顺序存储和链式存储。
顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称为顺序表。
在程序设计语言中,一维数组在内存中占用的存储空间就是一组连续的存储区域,因此,用一维数组来表示顺序表的数据存储区域是再合适不过的。
链式存储是通过-组任意的存储单元来存储线性表中的数据元素的,为建立数据元系之间的线性关系对每个数据元素除了存放数据元素自身的信息之外,还需要和一起存放其后继或前驱所在的存储单元的地址,这两部分信息组成一个“结点”,每个元素都如此。
存放数据元素信息的称为数据域,存放其前驱或后继地址的称为指针域。
只有一个存储单元地址的为单链表,有两个存储单元地址的为双链表。
考虑到实际的功能需求,每行的线性表可以用顺序存储方式,每个字符是一个节点。
#include <iostream>#include <fstream>#include <string>#include <iostream>#include <map>#include <string>#include <windows.h>bool login(std::map<std::string, std::string>& users) {std::string username, password;std::cout << "请输入用户名:";std::cin >> username;if (users.find(username) == users.end()) {std::cout << "用户名不存在" << std::endl;return false;}std::cout << "请输入密码:";std::cin >> password;if (users[username] != password) {std::cout << "密码错误" << std::endl;return false;}return true;}void registerUser(std::map<std::string, std::string>& users) {std::string username, password, confirmPassword;std::cout << "请输入用户名:";std::cin >> username;std::cout << "请输入密码:";std::cin >> password;std::cout << "请再次输入密码:";std::cin >> confirmPassword;if (password != confirmPassword) {std::cout << "两次输入的密码不一致,请重新注册。
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;}```该代码演示了一个简单的文本编辑器,用户可以通过输入选项来执行各种功能。
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 中的“另存为”对话框。
25编程器源码以下是一些编程器的源代码,可以帮助您在编写软件时提高效率和准确性。
1. 文本编辑器:一个简单的文本编辑器,可以让用户打开、编辑和保存文本文件。
它具有基本的文本编辑功能,如复制、粘贴和查找/替换。
```#include <iostream>#include <fstream>int main() {std::string filename;std::cout << 'Enter filena ';std::cin >> filename;std::ifstream file(filename);if (!file) {std::cout << 'Error opening the file!' << std::endl; return 1;}std::string line;while (std::getline(file, line)) {std::cout << line << std::endl;}file.close();return 0;}```2. 图片处理器:一个可以打开、编辑和保存图像文件的程序。
它可以执行一些基本的图像操作,如调整大小、旋转和应用滤镜。
```#include <iostream>#include <opencv2/opencv.hpp>int main() {std::string filename;std::cout << 'Enter filena ';std::cin >> filename;cv::Mat image = cv::imread(filename);if (image.empty()) {std::cout << 'Error opening the image!' << std::endl; return 1;}// Perform some image processing operations herecv::imshow('Image', image);cv::waitKey(0);cv::destroyAllWindows();return 0;}```3. 数据库管理器:一个用于连接和管理数据库的程序。
课题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);}。
/* A Screen Editer Subsystem */#define TURBOC#include <stdio.h>#include <dos.h>#include <string.h>#include <bios.h>#include <conio.h>#define BUF_SIZE 32000#define LINE_LEN 79-2#define MAX_LINES 24-1#define KILL_BUF_SIZE 4*LINE_LEN/***********************************************************/char buf[BUF_SIZE];char *curloc,*endloc;int scrnx,scrny;char killbuf[KILL_BUF_SIZE];char *helpline="F1:save F2:load F3:find F4:replace ^K:kill line ^Y:Yank ^Z:qiut"; /*************************************************************/ void edit(char *fname),help(void);void gotoxy(int x,int y),clrline(int y);void edit_clr_col(int x,int y),clrscr(void);void printline(char *p),delete_char(void);void search(void),kill_line(void);void scrolldn(int x,int y);void scrollup(int topx,int topy,int endx,int endy);void upline(void);void downline(void),left(void),right(void);void display_scrn(int x,int y,char *p);void pagedown(void),pageup(void),replace(void);void home(void),gotoend(void),yank(void);int load(char *fname),save(char *fname);void edit_gets(char *str);void draw_border(int,int,int,int,int);/***************************************************/main(int argc,char *argv[]){union REGS r;char fname[80];if(argc<2){draw_border(0,0,78,24,0x1f);draw_border(20,12,60,14,0x2f);gotoxy(20,11);printf("\7FILE NAME:");gotoxy(21,13);gets(fname);edit(fname);}if(argc==2){strupr(argv[1]);if(strstr(argv[1],".EXE")||strstr(argv[1],".COM")||\strstr(argv[1],".OBJ")||strstr(argv[1],".LIB")){printf("\7Can't edit file :%s",argv[1]);exit(1);}else edit(argv[1]);}r.h.ah=6;r.h.al=0;r.h.ch=0;r.h.cl=0;r.h.dh=24;r.h.dl=79;r.h.bh=7;int86(0x10,&r,&r);gotoxy(1,1);}/******************************************************************/ void edit(char *fname){union k{char ch[2];unsigned i;}key;char name[80];/* try to load the file */if(!load(fname))curloc=endloc=buf;strcpy(name,fname);/* set initial values to X,Y coordinate vars */scrnx=scrny=0;display_scrn(0,0,curloc);help();gotoxy(1,1);/* editer main loop . */do{#ifdef TURBOCkey.i=bioskey(0);#endifif(!key.ch[0]){switch(key.ch[1]){case 59: /*F1 :save file */save(name);break;case 60: /*F2: load file */clrline(MAX_LINES);gotoxy(1,MAX_LINES);printf("Enter filename :");edit_gets(name);strupr(name);if(strstr(name,".EXE")||strstr(name,".COM")||\strstr(name,".OBJ")||strstr(name,".LIB")){gotoxy(1,MAX_LINES);printf("\7Can't edit file: %s",name);getch();help();break;}if( * name) load(name);help();display_scrn(0,0,curloc);scrnx=scrny=0;break;case 61:search();break;case 62:replace();break;case 71:home();break;case 79:gotoend();break;case 75: /*left*/left();break;case 77:right();break;case 72:upline();break;case 80:downline();break;case 73:pageup();break;case 81:pagedown();break;case 83: /*Del*/if(curloc<endloc) delete_char();break;}if(curloc<buf){scrnx=scrny=0;curloc=buf;}gotoxy(scrnx+1,scrny+1); /*postion cursor */ }else{switch(key.ch[0]){case '\r':/*see if buffer is full */if(endloc==buf+BUF_SIZE-2) break;/* move contents of file below current location down one byte to make room for the RETURN.*/ memmove(curloc+1,curloc,endloc-curloc+1);*curloc=key.ch[0]; /*put RETURN in file *//*clear rest of line */edit_clr_col(scrnx,scrny);scrnx=0;scrny++;/*move text on screen down */if(scrny==MAX_LINES-1){/*at bottom of page */scrny=MAX_LINES-2;scrollup(1,1,LINE_LEN,scrny+1);}else scrolldn(scrnx+1,scrny+1);gotoxy(scrnx+1,scrny+1);printline(curloc);endloc++;/* advance the end of file pointer */ break;case '\b':if(curloc==buf) break;left();delete_char();break;case 11:kill_line();break;case 25:yank();break;case 26:clrline(MAX_LINES);gotoxy(1,MAX_LINES);printf("If saved file,press[Y]exit\7");if(tolower(getch())=='y') goto end;help();break;default: /* enter keystroke into file *//*see if buf is full */if(endloc==buf+BUF_SIZE-2) break;/*can't type past end of line */if(scrnx==LINE_LEN) break;memmove(curloc+1,curloc,endloc-curloc+1); *curloc=key.ch[0];putch(*curloc);gotoxy(scrnx+1,scrny+1);printline(curloc+1);curloc++;endloc++;}gotoxy(scrnx+1,scrny+1);}}while(1);end:printf("\n");}/**************************************************************************** Display a line pointed to by p.****************************************************************************/ void printline(register char *p){register int i;i=scrnx+1;while(*p!='\r'&&*p&&i<LINE_LEN){putch(*p);p++;i++;}}/**************************************************************************** Insert previously killled line.****************************************************************************/ void yank(void){char *p;p=killbuf;while(*p){memmove(curloc+1,curloc,endloc-curloc+1);*curloc=*p;if(scrnx<LINE_LEN){putch(*curloc);scrnx++;}endloc++;p++;}}/*******************************************************//* Delete the line at the current location */void kill_line(void){register int i;char *p,*killbufptr;if(*curloc=='\r'){delete_char();return;}edit_clr_col(scrnx,scrny); /*clear to CR *//* find out hoe many characters are in the line */p=curloc;i=0;killbufptr=killbuf;while(*p!='r'&&p<endloc){i++;*killbufptr=*p;p++;if(killbufptr<killbuf+KILL_BUF_SIZE-2) killbufptr++;}*killbufptr='\0';/* remove the line */memmove(curloc,curloc+i,endloc-curloc);endloc-=i;}/*********************************************************************** Global search and replace***********************************************************************/ void replace(void){register int len1;char str1[80],str2[80];char *p,*p2;clrline(MAX_LINES);gotoxy(1,MAX_LINES);printf("enter string to replace :");edit_gets(str1);clrline(MAX_LINES);gotoxy(1,MAX_LINES);printf("enter replacement:");edit_gets(str2);p=curloc;len1=strlen(str1);while(*str1){/*search for the string */while(*p && strncmp(str1,p,len1)) p++; if(!*p){clrline(MAX_LINES);gotoxy(1,MAX_LINES);printf("No found string %s",str1); getch();help();break;} /* not found *//* remove old string */memmove(p,p+len1,endloc-p);endloc-=len1;/*insert new string */p2=str2;while(*p2){memmove(p+1,p,endloc-p+1);*p=*p2;p++;endloc++;p2++;}}clrscr();/* find location of top screen */p=curloc;for(len1=scrny;len1>=0&&p<buf;){p--;if(*p=='r') len1--;}if(*p=='r') p++;/* redisplay current screen */display_scrn(0,0,p);help();}void delete_char(void){gotoxy(scrnx+1,scrny+1);if(*curloc=='r'){scrollup(1,scrny+1+1,LINE_LEN,MAX_LINES-1);memmove(curloc,curloc+1,endloc-curloc);endloc--;display_scrn(scrnx,scrny,curloc);help();}else{memmove(curloc,curloc+1,endloc-curloc);endloc--;printline(curloc);printf("");}}/************************************************************************* Display help line.*************************************************************************/ void help(void){gotoxy(1,MAX_LINES);printf(helpline);}/************************************************************************* Move cuuren location left*************************************************************************/ void left(void){if(curloc==buf) return;scrnx--;if(scrnx<0){scrnx=0;upline(); /*go up to next line *//* find end of line */while(*curloc!='r'){curloc++;scrnx++;}}else curloc--;}/********************************************************************** Move current position right.**********************************************************************/ void right(void){if(curloc+1>endloc) return;scrnx++;/* if at the end of line,go to the next one. */if(scrnx>LINE_LEN||*curloc=='\r'){scrnx=0;scrny++;if(scrny==MAX_LINES-1) /* at end of screen */{scrny=MAX_LINES-2;downline();/* move cursor and current loc to start of new line */curloc--;while(*curloc!='\r') curloc--;curloc++;scrnx=0;}else curloc++;}else curloc++;}/**********************************************************************/ void search(void){char str[80];register char *p;int len,i;clrline(MAX_LINES);gotoxy(1,MAX_LINES);printf("search string :");edit_gets(str);if(! *str){help();return;}p=curloc;len=strlen(str);while(*p&&strncmp(str,p,len)) p++;if(! *p){gotoxy(1,MAX_LINES);printf("\7No found string %s!",str);getch();help();return;} /* not found */i=0;while(p>buf&&*p!='\r'){p--;i++;}p++;i--;/* reposition curren location to start of match */curloc=p+i;scrnx=i;scrny=0;clrscr();display_scrn(0,0,p);help();}/***************************************************************************** Move up a line.*****************************************************************************/ void upline(void){register int i;char *p;if(curloc==buf)return;p=curloc;if(*p=='\r') p--;for(;*p!='\r'&&p<buf;p--);if(*p=='\r')return;curloc=p;curloc--;i=scrnx; /* save X coordinate *//* find start of next line */while(*curloc!='\r'&&curloc>buf) curloc--;scrny--;scrnx=0;curloc++;/* if at top of screen ,must stop */if(scrny<0){scrolldn(1,1);scrny=0;gotoxy(1,1);printline(curloc);}while(i&&*curloc!='\r'){curloc++;scrnx++;i--;}}/*************************************************************************** Move down one line,keep previous scrnx location if possible**************************************************************************/ void downline(void){register int i;char *p;i=scrnx;p=curloc;while(*p!='\r'&&p<endloc) p++;if(p==endloc) return;p++;curloc=p;scrny++;scrnx=0;if(scrny==MAX_LINES-1){scrny=MAX_LINES-2;scrollup(1,1,LINE_LEN,MAX_LINES-1);gotoxy(scrnx+1,scrny+1);printline(curloc);}while(i&& *curloc!='\r' && curloc<endloc){curloc++;scrnx++;i--;}}/**************************************************************************** Display a screen full of text (up to 24 lines)***************************************************************************/ void display_scrn(int x,int y,char *p){register int i,j;gotoxy(x+1,y+1);textcolor(WHITE);textbackground(BLUE);i=0;while(y<MAX_LINES-1&&*p){switch(*p){case '\r': printf("\n");y++;gotoxy(1,y+1);i=0;break;case '\x09':for(j=0;j<8;j++){printf(" ");i++;}default:if(i<LINE_LEN) putch(*p);i++;}p++;}}/**************************************************************************** Page down MAX_LINES lines*****************************************************************************/ void pagedown(void){register int i;clrscr();for(i=0;i<MAX_LINES&&curloc<endloc;){if(*curloc=='\r') i++;curloc++;}help();scrnx=0;scrny=0;display_scrn(0,0,curloc);}/*************************************************************************** Page up MAX_LINES line***************************************************************************/ void pageup(void){register int i;clrscr();for(i=0;i<MAX_LINES&&curloc>buf;){if(*curloc=='\r') i++;curloc--;}scrnx=scrny=0;display_scrn(0,0,curloc);help();}/************************************************************************** Go to the end of the file**************************************************************************/ void gotoend(void){int i;char *p;p=curloc;for(i=scrnx;*p!='\r'&&p<endloc;){scrnx++;p++;i++;}gotoxy(scrnx+1,scrny+1);curloc=p;}/**************************************************************************** Load a file****************************************************************************/ int load(char *fname){FILE *fp;char ch,*p;int i;draw_border(0,0,78,24,0x2f);clrscr();if((fp=fopen(fname,"rb"))==NULL) return 0;gotoxy(1,1);p=buf;while(!feof(fp)&&p!=buf+BUF_SIZE-2){ch=getc(fp);if(ch=='\x09')for(i=0;i<8;i++,p++) *p='\x20';else if(ch!='\n'&&ch!=EOF){*p=ch;p++;}}*p='\0';fclose(fp);curloc=endloc=p;clrscr();curloc=buf;help();scrnx=scrny=0;display_scrn(0,0,curloc);}/****************************************************************************** ***Go to top the file******************************************************************************/ void home(void){curloc-=scrnx;scrnx=0;gotoxy(scrnx+1,scrny);}/****************************************************************************** Save a file*****************************************************************************/ int save(char *fname){int i;FILE *fp;char *p,name[80];if(!*fname){clrline(MAX_LINES);gotoxy(1,MAX_LINES);printf("filename:");gets(name);}else strcpy(name,fname);if((fp=fopen(name,"wb"))==NULL) return 0;p=buf;while(p!=endloc){if(*p!='\r')putc(*p,fp);else{putc('\r',fp);putc('\n',fp);}p++;}fclose(fp);clrline(MAX_LINES);printf("file %s already saved.",name);help();return 1;}/****************************************************************************** Read a string from the keyboard*****************************************************************************/ void edit_gets(char *str){char *p;p=str;for(;;){*str=getch();if(*str=='\r'){*str='\0';return;}if(*str=='\b'){if(str>p){str--;putch('\b');putch(' ');putch('\b');}}else{putch(*str);str++;}}}/****************************************************************************** *Read and save cursor coordinates******************************************************************************/ void cursor_pos(void){union REGS i,o;i.h.ah=3;int86(16,&i,&o);}/****************************************************************************** **Send cursor to specified X,Y(0,0 is upper left corner).*****************************************************************************/ void gotoxy(int x,int y){union REGS i;i.h.dh=y;i.h.dl=x;i.h.ah=2;i.h.bh=0;int86(16,&i,&i);}/***************************************************************************** Clear entire line given its Y coordinate*****************************************************************************/ void clrline(int y){register int i;gotoxy(1,y);for(i=0;i<LINE_LEN;i++) putch(' ');textcolor(WHITE);textbackground(BLUE);}/**************************************************************************** Clear to end of specified line.****************************************************************************/ void edit_clr_col(int x,int y){char *p;p=curloc;gotoxy(x+1,y+1);for(;x<LINE_LEN&&*p!='\r'&&*p;x++,p++){printf(" ");}}/**************************************************************************** Clear the screen.****************************************************************************/ void clrscr(void){union REGS r;r.h.ah=6;r.h.al=0;r.h.ch=1;r.h.cl=1;r.h.dh=MAX_LINES-1;r.h.dl=LINE_LEN;r.h.bh=0x1f;int86(0x10,&r,&r);}/*************************************************************************** Scroll down the screen.***************************************************************************/ void scrolldn(int x,int y){union REGS r;r.h.ah=7;r.h.al=1;r.h.ch=y;r.h.cl=x;r.h.dh=MAX_LINES-1;r.h.dl=LINE_LEN;r.h.bh=0x1f;int86(0x10,&r,&r);}/**************************************************************************** Srcoll up the screen.****************************************************************************/ void scrollup(int topx,int topy,int endx,int endy){union REGS r;r.h.ah=6;r.h.al=1;r.h.ch=topy;r.h.cl=topx;r.h.dh=endy;r.h.dl=endx;r.h.bh=0x1f;int86(0x10,&r,&r);}/**************************************************************************/ void draw_border(int beginx,int beginy,int endx,int endy,int attr){int i;union REGS r;r.h.ah=6;r.h.al=0;r.h.ch=beginy;r.h.cl=beginx;r.h.dh=endy;r.h.dl=endx+1;r.h.bh=attr;int86(0x10,&r,&r);for(i=beginx;i<endx;i++){ gotoxy(i,beginy);putchar(196);gotoxy(i,endy);putchar(196);}for(i=beginy;i<=endy;i++){gotoxy(beginx,i);putchar(179);gotoxy(endx,i);putchar(179);}gotoxy(beginx,beginy);putchar(218);gotoxy(beginx,endy);putchar(192);gotoxy(endx,beginy);putchar(191);gotoxy(endx,endy);putchar(217);}。
文本编辑器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 ;}。
文本编辑器文本编辑器是最常用的文档创建和编辑工具。
随着计算机科学与技术的发展,用来处理文本的编辑器随处可见,并且形式多样。
比如,Windows下的记事本,写字板,EditPlus,UltraEdit等都是十分优秀的文本编辑器和处理工具。
在本章中,我们将向读者讲解如何利用C语言来发展开发一个简易的文本编辑器。
1 设计目的利用C语言的单链表数据结构及相关函数,本章编程实现了一个与DOS操作系统下的Edit相似的文本编辑器。
再次文本编辑器中,用户可以通过快捷和选择菜单项,完成基本的文本编辑器和文件处理工作。
通过文章的介绍,读者可以了解文本编辑器的开发过程,掌握菜单的开发技巧,加深对文件操作的理解。
更重要的是,希望此程序能抛砖引玉,引领读者掌握编程的方法和技巧,开发出更优秀的程序。
2 功能描述如图.1所示,文本编辑器主要由五大功能模块构成,它们分别是文件操作模块,文本编辑模块,剪切操作模块,菜单控制模块和帮助及其他模块。
下面分别简要介绍功能模块的功能。
(1)文件操作模块。
在文件操作模块中,主要完成文件的创建,打开,保存和另存操作。
用户可以选择File菜单上的New子菜单来完成新建文本文件操作;选择File菜单上的Save子菜单来完成保存文件操作选择File菜单上的Open子菜单来完成打开文件操作;选择Flie菜单上的Save as子菜单来完成文件的另存为操作。
在文件的打开,保存和另存为操作中,系统会提示用户输入文件路径及文件名。
值得一提的是,当用户打开一个文件时,指定的文件必须存在,否则系统会报错。
(2)文本编辑器模块。
在文本编辑器模块中,主要完成在编辑窗口中以添加或插入的方式输入字符,删除光标所在当前位置的单个字符或前一个位置的单个字符,朝上下左右4个方向的光标移动操作。
当光标所在位置及后面的位置没有字符时,系统会以添加的方式输入字符;当光标所在位置及后面的位置有字符时,系统会已插入的方式输入字符。
用户可以使用BackSpace键删除光标前一个字符,也可以使用Del键删除当前位置的字符或删除Ctrl+左移(右移)键i选定了的多个字符。
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值。