c++简易文本编辑器.txt

合集下载

用C编写文本编辑器实验报告

用C编写文本编辑器实验报告

用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、实验结果及程序运行界面。

用txt做c的简单编译

用txt做c的简单编译

用txt做c的简单编译要使用文本文件(.txt)进行C语言编译,需要先将文本文件中的C代码复制到一个C源文件(.c)中,然后使用C编译器对该源文件进行编译。

下面是一个简单的步骤:1. 创建一个新的文本文件,命名为example.txt,将C代码复制到该文件中。

例如,我们复制以下代码到example.txt文件中:```c#include <stdio.h>int main() {printf("Hello, World!");return 0;}```2. 将文本文件另存为一个新的C源文件,命名为example.c。

确保文件扩展名为.c,而不是.txt。

3. 打开C编译器,例如GCC编译器。

4. 在命令行中定位到存储了example.c文件的目录。

5. 使用C编译器命令对example.c文件进行编译,生成可执行文件。

例如,在命令行中输入以下命令并按回车键执行:```bashgcc example.c -o example```这将使用GCC编译器将example.c文件编译为名为example的可执行文件。

6. 若编译成功,将生成一个名为example的可执行文件。

7. 在命令行中执行生成的可执行文件。

例如,在命令行中输入以下命令并按回车键执行:```bash./example```这将运行可执行文件并将输出打印在命令行中,输出结果为"Hello, World!"。

这样,你就可以使用文本文件(.txt)进行C语言编译了。

请注意,使用文本文件编译C代码只是对源文件的简单重命名,实际编译还是需要使用C编译器进行的。

C语言文本编辑器

C语言文本编辑器

附件二116755043.doc【学生用】西北农林科技大学信息工程学院数据结构与C语言综合训练实习报告题目:文本编辑器学号2011013228姓名马跃专业班级电子商务112指导教师景旭实践日期2010年7月5日-7月16日目录一、综合训练目的与要求 (1)二、综合训练任务 (1)三、总体设计 (1)四、详细设计说明 (2)五、调试与测试 (9)六、实习日志 (14)七、实习总结 (15)八、附录:核心代码清单 (15)一、综合训练目的与要求正文本综合训练是计算机科学与技术、信息管理与信息系统、软件工程专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》、《数据结构》课程后进行的一次全面的综合练习。

本课综合训练的目的和任务:1 巩固和加深学生对C语言、数据结构课程的基本知识的理解和掌握2 掌握C语言编程和程序调试的基本技能3利用C语言进行基本的软件设计4 掌握书写程序设计说明文档的能力5提高运用C语言、数据结构解决实际问题的能力二、综合训练任务本综合训练是计算机科学与技术、信息管理与信息系统、软件工程专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》、《数据结构》课程后进行的一次全面的综合练习。

本课综合训练的目的和任务:1巩固和加深学生对C语言、数据结构课程的基本知识的理解和掌握2掌握C语言编程和程序调试的基本技能3利用C语言进行基本的软件设计4掌握书写程序设计说明文档的能力5提高运用C语言、数据结构解决实际问题的能力三、总体设计1.设计题目------文本编辑系统2.已知技术参数和设计要求1分别统计出其中英文字母数和空格数及整篇文章总字数;2统计某一字符串在文章中出现的次数,并输出该次数;(采用模式匹配算法)3删除某一子串,并将后面的字符前移;4实现某一个字符的替换;5实现某一个字符串的替换;四、详细设计说明 1. 程序框架图1 简单的文本编辑器主框架**************************************************** **** 欢迎使用简单的文本编辑器 **** **************************************************** **** 主菜单 **** **************************************************** **** 1、输入文本内容 **** **** 2、显示当前文本内容 **** **** 3、文本内容统计菜单 **** **** 4、文本内容处理菜单 **** **** 5、关于 **** **** 6、退出本系统 **** **************************************************** **** 注:第一次使用本系统时请选择1号功能 **** ****************************************************判断1 2 3 4 5 6文本内容的输入,CreatWord(),将文本内容输入到已申请的存储空间中显示函数, List,将当前文本中内容显示出来文章内容统计菜单, CountWord(),以菜单形式显示给用户,对文章的内容进行各种方式的统计文章内容处理菜单,Bmenu(),这部分为一子菜单,使用了包括Search 、Delete Insert 等多个函数,对文章内容进行处理一个类似与作者信息的代码,AboutWor d(),显示作者信息退出系统两个子菜单:如选择上图中功能3,则有:图2 简单的文本编辑器----文本内容统计菜单********************************************** **** 文章内容统计菜单 **** ********************************************* **** 1、文章中大写字母的个数 **** **** 2、文章中小写字母的个数 **** **** 3、文章中数字的个数 **** **** 4、文章中标点符号的个数 **** **** 5、文章中空格的个数 **** **** 6、文章中所有字数 **** **** 7、退出返回主菜单 **** **** 8、直接退出本系统 **** *********************************************判断统计文本中大写字母个数1 统计文本中小写字母个数2 统计文本中数字的个数3 统计文本中标点符号的个数4 统计文本中空格的个数5 统计文本所有字数6 返回到主菜单7 直接退出系统8如选择功能4,则有:图3 简单的文本编辑器-----文本内容处理菜单2. 模块功能说明1. 主要函数组成1.Hollow() 标题函数主菜单函数,其结果为图1所显示部分,将1、2、3、4、8、9等函数合。

简单的行编辑器(C语言)

简单的行编辑器(C语言)

简单的行编辑器【要求】(1)设置一个简单的行编辑器,每行以回车结束(2)数据以文件形式存储(3)编辑器具有查找、替换、修改数据的功能2011-7-9。

请把所有的注释信息提取出来就可以写程序设计报告。

#include <stdio.h> /*标准文件流操作,这里使用了open/fclose/fprintf/printf/scanf/gets函数*/#include <stdlib.h> /*标准系统库,这里使用了malloc/free/exit*/#include <string.h> /*标准字符串库,这里使用strlen/strcpy/memcpy/memset*/ #define szLINE 252 /*定义一行字符串最长为252字节*/#define CMDS 12 /*定义12个标准行编辑命令*//*采用链表存储文本*/typedef struct LINE {char text[szLINE]; /*文本内容*/struct LINE * next; /*链表指针*/}L;/*简写无类型整数*/typedef unsigned int U; /*定义12个行编辑命令的标准格式*/typedef void (*FUNC)(L **, char*); /*定义12个标准行编辑命令的关键字*/char keywords[CMDS][8]={"quit", "help", "load", "save","view", "count", "append", "insert","erase", "edit", "lookup", "replace"}; /*end keywords*//*清空链表操作*/void clear(L ** lines){ L *a =0, *b=0;if(!lines) return ;a = *lines;while(a) {b=a->next ;free(a);a=b;} /*end while*/*lines=0;} /*end clear*//*在链表中根据行号index调出指定的行*/L *locate(L *lines, U index){ L *t=lines; U i = 0;if(!t) return 0;if(index == 0) return t;for(i=0; i<index;i++) {t=t->next;if(!t) return 0;}/*next*/return t;}/*end locate*//*浏览命令,如果f存在则以带行号格式保存文件(如果f==stdout则打印到屏幕上),浏览范围为from到to(行号)。

vc实现记事本文本

vc实现记事本文本

2010~2011学年度第一学期期末考试 2009 级 软件技术 专业《Visual C++程序设计》科试题(A )(命题教师: 王成 考试方式:机考(作品)考试时间:第18~第19周) 系部 班别 姓名 学号一、实现一个简单文本编辑器 编辑器的基本功能包括文件操作/文件编辑/插入功能/格式设置等等。

具体要求如下: 1.文档操作:主要是在txt 文档中输入文字信息。

2.文件操作:包括文件的新建、打开、关闭、保存、另存为及退出程序等功能。

3.文件编辑:包括撤销上一步操作、剪切、复制、粘贴、删除、全选、查找、查找下一个、替换等功能。

4.插入功能:主要是为了方便使用者插入日期、时间等信息。

5.字体设置:可以通过[字体]菜单对编辑器的显示字体进行设定,字体设定应能设置字体的颜色。

字体的不需要保存到文件,即字体设置只在当前编辑时有效,退出程序并再次运行时不需要与上次的字体相同。

6.对于以CEditView 类实现的方式,文件编辑功能的相应菜单项不得使用以下ID 值: ID_EDIT_UNDO ID_EDIT_CUT ID_EDIT_COPY ID_EDIT_PASTE ID_EDIT_FIND ID_EDIT_REPEAT ID_EDIT_REPLACE ID_EDIT_CLEARID_EDIT_CLEAR_ALL二、成绩评定方式(满分100分)根据任务完成情况评定。

由教师根据软件作品的完成情况给予评分,并进行随机提问,最终每人提交软件作品一份。

1.文件操作:文件的新建、打开、关闭、保存、另存为----------20分;2.文件编辑:撤销、剪切、复制、粘贴、删除、全选-------------20分;3.文件编辑:查找、查找下一个、替换-------------------------------30分;4.字体设置:字体设定--------------------------------------------------- 10分5.字体设置:字体颜色设置----------------------------------------------10分6.插入功能:插入日期、时间等信息----------------------------------10分。

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语言文本编辑器设计

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

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

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

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

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

按任意键返回操作菜单。

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

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

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

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

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

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

C简单文本编辑器

C简单文本编辑器

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

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

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

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

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

向其中添加RichTextBox控件、MenuStrip控件、open控件、save、 fontDialog、colorDialog。

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

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

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

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

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

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

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

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

e.设置issave、tchange的值。

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

否则:设置save控件Title、Filter值。

b.使用save()方法打开“保存文件”对话框,输入要保存的文件名。

简易文本编辑器

简易文本编辑器

简易文本编辑器猴子吃桃子问题二〇一四 年 六 月猴子吃桃子问题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语言下数组长度的有限性。

关键字:文件提取、存储;字符串替换、查找;插入;删除;行移动;1 引言在操作系统中,外存中的数据、文档或程序,都是以文件的形式保存,甚至对目录和各种设备的操作也都等同于文件的操作。

因此对文件的操作就要求首先从文件中读取数据,然后对读取的数据进行操作,最后,当操作完成后再将数据重新写入文件中。

在此过程中必须熟练掌握文件的基本操作。

首先要调用一个文件,需要有以下的信息:1、文件当前的读写位置,文件存放在哪个磁介质中,含盘符及路径。

2、与该文件对应的内存缓冲区的地址。

3、缓冲区中未被处理的字符串。

4、文件操作方式,是读数据还是写数据。

从文件中读取数据,然后以链表的形式放入内存中,对文件数据进行查找替换删除操作。

找到要进行操作的字符串的位置,然后再进行一系列的操作。

最后,完成对文件数据的操作,重新调用文件指针将数据写入文件操作,完成实验。

将数据从文件中读取出来以后,在进行操作。

2 问题分析一个简易文本编辑器应该具有图形菜单界面,包括查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块),删除文本信息等功能并可正确存盘、取盘,正确显示总行数。

3 数据结构与算法分析3.1 结构与算法分析为实现数据结构的有序存储,该编辑器应该用顺序表来存储输入的信息。

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

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

在编辑器的主界面中如下提示信息:3.11清空以前的文本信息:将用数据内容全部置为0;显示当前文本信息:遍历用数组存入的信息,并输出到显示器上:3.12编辑信息:定义一个结构体,并在结构体中定义一个字符型的一维数组和一个整型变量,这个整型变量用于记录一维数组中存入数据的个数;3.13替换文本信息:首先在数组中查找要被替换的信息,如果找到该信息,提示输入要替换的信息内容,否则提示未找到要被替换的信息:3.14插入文本信息:首先在数组中查找要插入的点,如果找到该插入点,提示输入插入信息,确认插入信息后,提示选择向前插入信息还是向后插入信息,如果未找到插入点,显示未找到要插入的位置;3.15移动文本信息:首先在数组中查找要移动的信息,如果找到该信息,提示是进行列移动还是行移动,否则提示未找到要移动的信息;3.16删除文本信息:首先在数组中查找要删除的信息,如果找到该信息,提示是否确认删除该信息,通过确认来删除信息,如果未找到要删除的信息,提示未找到该信息;4结语本实验通过对文件数据的操作,主要考查了一下几个方面的知识:1、对文件的基本操作,包括数据的读取和重新写入;2、要求掌握对数组的熟练运用,包括数组的,查找,替换,删除,插入等;3、重点要求掌握在函数调用。

文本编辑器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 ;}。

简易文本编辑器

简易文本编辑器

//简易文本编辑器,包含KMP算法,大量指针的使用#include<iostream>#include<cstring>#include<fstream>#include<iomanip>#include<string>usingnamespace std;struct zifu// 录入或者读入的每一个字符都用链表进行存储{char data;zifu* pnext;};struct biao_zhi//存取要被替换或删除的字符所在位置{zifu* tihuan1;zifu* tihuan2;int wei_zhi;biao_zhi* pnext;};//回车和空格可以检测到,回车和空格可以存入数组//回车的存入格式为'\n',空格为' ',每一行有80个字符空间//再怎么长,没有输入回车也按照一行处理//i加1记录出入的字符的个数,回车空格也会统计在内//录入功能zifu* lu_ru(){getchar();//丢弃第一个回车符zifu* phead=NULL;zifu* ptail=NULL;zifu* ptemp=NULL; //用来开辟临时空间zifu* phead1=NULL;//用来把所有的字符从头到尾再输出一遍char ch; //获取输入的字符//inti=0;//int j=0;while((ch=getchar())!=EOF)//判断输入是否完成输入{ptemp = new zifu[1];//开辟一个空间ptemp->data=ch; //暂时存着字符ptemp->pnext=NULL;//i++;//字符个数加1if(phead==NULL/*&& phead1==NULL*/ ){phead=ptemp;ptail=ptemp;}else{ptail->pnext=ptemp;ptail=ptail->pnext;}}phead1=phead;while(phead1!=NULL){cout<<phead1->data;phead1=phead1->pnext;}return phead;}int bao_cun(zifu* ptemp3){char ch;char name[30];int i=0;cout<<"输入文件名(格式H:\\xxx.txt):";getchar();//丢弃第一个回车符//获取文件名ch=getchar();while(ch!='\n'){name[i]=ch;ch=getchar();i++;}name[i]='\0';ofstream outFile(name);if(!outFile){cerr<<"ereor:unable to open file!";return 1;}while(ptemp3!=NULL){outFile<<ptemp3->data; //将字符ch写入文件ptemp3=ptemp3->pnext;}cout<<"保存成功,请到H盘查找"<<endl;return 0;}zifu* read(){FILE *fp;zifu* read_head=NULL;zifu* temp=NULL;zifu* tail=NULL;int ch;char name[30];//文件名int i=0;cout<<"输入文件名(格式H:\\xxx.txt):";getchar();//丢弃第一个回车符//获取文件名ch=getchar();while(ch!='\n'){name[i]=ch;ch=getchar();i++;}name[i]='\0';if((fp=fopen(name,"rb+"))==NULL){cout<<"文件不存在!"<<endl;//测试用,一定会自动建立一个getchar();return 0;}//读文件ch=fgetc(fp);while(ch!=EOF){putchar(ch);temp= new zifu[1];temp->data = ch;temp->pnext =NULL;if(read_head==NULL){read_head=temp;tail=temp;}else{tail->pnext=temp;tail=tail->pnext;}ch=fgetc(fp);}cout<<"读入成功!"<<endl;return read_head;}void insert(zifu* phead)//插入回车有点问题{zifu* temp=NULL;zifu* temp1=phead;zifu* temp2=NULL;int x=0,y=0;int i=1,j=0;char ch;cout<<"请输入要插入文本的位置(x行,y列): ";cout<<"请输入行数: ";cin>>x;cout<<"请输入列数: ";cin>>y;while(temp1->data!=NULL){if(i==x)//是否是要找的行数,没有找到则不执行{for(j=0;j<y-1;j++)//查找列数temp1=temp1->pnext;temp2=temp1->pnext;cout<<"输入要插入的字符: ";ch=getchar();//丢弃第一个回车符ch=getchar();while(ch!=EOF){if(ch=='\n');else{temp = new zifu[1];temp->data=ch;temp->pnext=NULL;temp1->pnext=temp;temp1=temp1->pnext;}ch=getchar();}temp1->pnext=temp2;cout<<"插入字符成功!"<<endl;break;}if(temp1->data=='\n')//到没到要到达的行数,到了将进入下一行{temp1=temp1->pnext;//进入下一行i++;}else{temp1=temp1->pnext;}}}char* get_zifuchuan(){//获取要比较的字符串char* mu_biao;char ch;int i=0;zifu* phead=NULL;zifu* temp=NULL;zifu* ptail=NULL;ch=getchar(); // 丢弃第一个回车符cout<<"输入要查找/替换的字符或字符串: ";ch=getchar();while(ch!=EOF){if(ch=='\n');//如果得到回车键不做任何处理else{temp = new zifu[1];temp->data=ch;temp->pnext=NULL;i++;//记录字符的个数if(phead==NULL){phead=temp;ptail=temp;}else{ptail->pnext=temp;ptail=ptail->pnext;}}ch=getchar();}mu_biao= newchar[i+1];i=0;//字符归0while(phead!=NULL){mu_biao[i]=phead->data;i++;phead=phead->pnext;}mu_biao[i]='\0';return mu_biao;}//计算特征向量,并且返回到主函数int *Next(char *mu_biao){int m=0;//获取目标串的长度while(mu_biao[m]!='\0'){m++;}if(m<=0)return 0;//失败int *N = newint[m];N[0]=0;for(int i=1;i<m;i++){int k=N[i-1];while(k>0 &&mu_biao[i]!=mu_biao[k])k=N[k-1];if(mu_biao[i]==mu_biao[k])N[i]=k+1;elseN[i]=0;}return N;//返回各个字符的特征向量值}biao_zhi* KMP(zifu* chang_chuan, char* mu_biao,int * N, int startIndex) {zifu* phead=NULL;//长串的头zifu* ptemp=NULL;//用来申请临时空间zifu* ptemp1=NULL;zifu* phead2=NULL;//要求它比phead的移动慢一步biao_zhi* biaozhi_temp=NULL;//申请临时空间biao_zhi* biaozhi_head=NULL;//头biao_zhi* biaozhi_tail=NULL;//尾int L=0;//长串的长度int BIAOZHI=0;//记录是第几次配对情况int wenben_long=0;// 文本的总长度int lastIndex=0;phead=chang_chuan;phead2=chang_chuan;ptemp=chang_chuan;ptemp1=chang_chuan;//开辟一个临时空间biaozhi_temp = new biao_zhi[1];biaozhi_temp->pnext=NULL;biaozhi_temp->tihuan1=NULL;biaozhi_temp->tihuan2=NULL;//计算长串的长度while(ptemp1!=NULL){wenben_long++;ptemp1=ptemp1->pnext;}//获取目标串的长度int l=0;while(mu_biao[l]!='\0'){l++;}lastIndex=wenben_long-l;if(lastIndex-startIndex<0)//若startIndex过大,则无法匹配成功{cout<<"查找失败!"<<endl;return biaozhi_head;}int i;int j=0;for(i=startIndex;i<wenben_long;i++){if(phead->data=='\n'&& j!=l)//当长串遇到回车并且没有匹配成功,因为遇到回车标志着进入了另一行{j=0;//j归0}else{while(mu_biao[j] != phead->data && j>0)j = N[j-1];if(mu_biao[j]==phead->data)//出现单个字符匹配的情况{j++;if(j==1)//如果是第一个字符匹配biaozhi_temp->tihuan1=phead2;//用指针标志第一个字符的前一个字符的位置}else;if(j==l)//匹配成功了{BIAOZHI++;//匹配成功的次数cout<<"您要查找的目标串的位置为:"<<(i-j+1+1)<<endl;biaozhi_temp->tihuan2=phead->pnext;//用指针标志匹配成功的字符串的最后一个字符的后一个字符的位置biaozhi_temp->wei_zhi=BIAOZHI;//记录这是第几次匹配成功if(biaozhi_head==NULL)//创建biao_zhi类的链表{biaozhi_head=biaozhi_temp;biaozhi_tail=biaozhi_temp;}else{biaozhi_tail->pnext=biaozhi_temp;biaozhi_tail=biaozhi_tail->pnext;}//开辟一个新的空间biaozhi_temp = new biao_zhi[1];biaozhi_temp->pnext=NULL;biaozhi_temp->tihuan1=NULL;biaozhi_temp->tihuan2=NULL;j=0;//j归0,接着重新往下搜}else;}phead=phead->pnext;if(i>=1){phead2=phead2->pnext; //比phead的移动要慢一步}}if(biaozhi_head==NULL){cout<<"匹配失败!"<<endl;return biaozhi_head;}elsereturn biaozhi_head;}void zifu_delete(char* mu_biao1,zifu* head1,biao_zhi* biao_zhi1){int K;//删除第几处char flag='Y';//简单标志位char flag1='Y';biao_zhi* biaozhi_temp=NULL;biaozhi_temp=biao_zhi1;zifu* head2=NULL;head2=head1;cout<<"是否全部删除?(Y/N)";cin>>flag1;if(flag1=='Y'|| flag1=='y'){while(biaozhi_temp!=NULL){biaozhi_temp->tihuan1->pnext = biaozhi_temp->tihuan2;// 接上后串biaozhi_temp=biaozhi_temp->pnext;}cout<<"删除后的新串: "<<endl;biaozhi_temp=biao_zhi1;//重新归位while(head2!='\0'){cout<<head2->data;head2=head2->pnext;}head2=head1;//重新归位}else{while(1){cout<<"您要删除第几处?请输入:";cin>>K;while(biaozhi_temp->wei_zhi!=K)biaozhi_temp=biaozhi_temp->pnext;biaozhi_temp->tihuan1->pnext = biaozhi_temp->tihuan2;// 接上后串cout<<"删除后的新串: "<<endl;biaozhi_temp=biao_zhi1;//重新归位while(head2!='\0'){cout<<head2->data;head2=head2->pnext;}head2=head1;//重新归位cout<<"是否继续?(Y/N)";cin>>flag;if(flag!='Y'&& flag!='y')break;}}}void ti_huan(char* mu_biao1,zifu* head1,biao_zhi* biao_zhi1){int K;//替换第几处int i=0;char flag='Y';//简单标志位char flag1='Y';biao_zhi* biaozhi_temp=NULL;biaozhi_temp=biao_zhi1;zifu* head2=NULL;head2=head1;char* ti_huan; //要被换上的字符串cout<<"是否全部替换?(Y/N)";cin>>flag1;if(flag1=='Y'|| flag1=='y'){zifu* tihuantemp=NULL;ti_huan=get_zifuchuan();while(biaozhi_temp!=NULL){i=0;while(ti_huan[i]!='\0')// 连接上要拷上去的字符{tihuantemp=new zifu[1];tihuantemp->data=ti_huan[i];tihuantemp->pnext=NULL;biaozhi_temp->tihuan1->pnext=tihuantemp;biaozhi_temp->tihuan1=biaozhi_temp->tihuan1->pnext;i++;}biaozhi_temp->tihuan1->pnext = biaozhi_temp->tihuan2;// 接上后串biaozhi_temp=biaozhi_temp->pnext;}cout<<"替换后的新串: "<<endl;biaozhi_temp=biao_zhi1;//重新归位while(head2!='\0'){cout<<head2->data;head2=head2->pnext;}head2=head1;//重新归位}else{while(1){cout<<"您要替换第几处?请输入:";cin>>K;while(biaozhi_temp->wei_zhi!=K)biaozhi_temp=biaozhi_temp->pnext;zifu* tihuantemp=NULL;ti_huan=get_zifuchuan();i=0;while(ti_huan[i]!='\0'){tihuantemp=new zifu[1];tihuantemp->data=ti_huan[i];tihuantemp->pnext=NULL;biaozhi_temp->tihuan1->pnext=tihuantemp;biaozhi_temp->tihuan1=biaozhi_temp->tihuan1->pnext;i++;}biaozhi_temp->tihuan1->pnext = biaozhi_temp->tihuan2;// 接上后串i=0;cout<<"替换后的新串: "<<endl;biaozhi_temp=biao_zhi1;//重新归位while(head2!='\0'){cout<<head2->data;head2=head2->pnext;}head2=head1;//重新归位cout<<"是否继续?(Y/N)";cin>>flag;if(flag!='Y'&& flag!='y')break;}}}void main(){int flag=1;int* next;//特征向量char* mu_biao;//要查找的目标char key;int wei_zhi;zifu* head=NULL;biao_zhi* BIAO_ZHI=NULL;while(flag==1){cout<<"/**************************************/"<<endl;cout<<"/* 欢迎使用简易文本编辑器*/"<<endl;cout<<"/* 功能2,3,4,5先行录入或读取文件*/"<<endl;cout<<"/* */"<<endl;cout<<"/* 1.录入操作*/"<<endl;cout<<"/* 2.删除操作*/"<<endl;cout<<"/* 3.替换操作*/"<<endl;cout<<"/* 4.插入操作*/"<<endl;cout<<"/* 5.保存文件*/"<<endl;cout<<"/* 6.读取文件*/"<<endl;cout<<"/* 0.退出*/"<<endl;cout<<"/* */"<<endl;cout<<"/**************************************/"<<endl;cout<<"请选择对应功能: ";int i=0;cin>>i;switch(i){case 0 : flag=0; break;case 1 : head=lu_ru();break;case 2 : mu_biao=get_zifuchuan(); //要删除的目标next=Next(mu_biao); //计算特征向量BIAO_ZHI = KMP(head,mu_biao,next,0); //匹配,找到位置zifu_delete(mu_biao,head,BIAO_ZHI); //删除break;case 3: mu_biao=get_zifuchuan();//要替换的字符串next=Next(mu_biao);//计算特征向量BIAO_ZHI = KMP(head,mu_biao,next,0);//匹配,找到位置ti_huan(mu_biao,head,BIAO_ZHI); //替换break;case 4:insert(head);break;break;case 5 : bao_cun(head);break;case 6 : head=read( );break;case 7 :default :break;}}while(head!=NULL){cout<<head->data;head=head->pnext;}}。

用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运行程序,可以看到文件已经被打开了下面我们接着说如何实现“打开”、“保存”、“另存为”菜单项的功能。

简易文本编辑器

简易文本编辑器

#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 << "无效的行号。

C创建一个文本文件.txt

C创建一个文本文件.txt

C创建一个文本文件.txt如何用C++在磁盘创建一个文本文档用fstream流有关文件常用方法如下:在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:1、插入器(<<)向流输出数据。

比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"Write Stdout"<<'n';就表示把字符串"Write Stdout"和换行字符('n')输出到标准输出流。

2、析取器(>>)从流中输入数据。

比如说系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin>>x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。

在C++中,对文件的操作是通过stream的子类fstream(file stream)来实现的,所以,要用这种方式操作文件,就必须加入头文件fstream.h。

下面就把此类的文件操作过程一一道来。

一、打开文件在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:void open(const char* filename,int mode,int access);参数:filename:要打开的文件名mode:要打开文件的方式access:打开文件的属性打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:ios::app:以追加的方式打开文件ios::ate:文件打开后定位到文件尾,ios:app就包含有此属性ios::binary:以二进制方式打开文件,缺省的方式是文本方式。

两种方式的区别见前文ios::in:文件以输入方式打开ios::out:文件以输出方式打开ios::nocreate:不建立文件,所以文件不存在时打开失败ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败ios::trunc:如果文件存在,把文件长度设为0可以用“或”把以上属性连接起来,如ios::out|ios::binary打开文件的属性取值是:0:普通文件,打开访问1:只读文件2:隐含文件4:系统文件可以用“或”或者“+”把以上属性连接起来,如3或1|2就是以只读和隐含属性打开文件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf("输入A:确定打开文件(未保存的数据将会丢失) M:返回主菜单");
fflush(stdin);
pd=getchar();
if (pd=='A'||pd=='a')
{
printf("请输入要打开文件名字(例如c:\\a.txt)");
scanf("%s",name);
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将重头查找;任意键返回主菜单");
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");
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;
pd=getchar();
if (!(pd=='A'||pd=='a'))
{
menu();
}
else
{
if(name[20]==NULL)
{
printf("\n请输入保存文件名(例如: c:\\a.txt):");
scanf("%s",name);
#include <string.h>
#define MAX 10000
#define _CRT_SECURE_NO_DEPRECATE //在vs中取消warning的警告
void menu();
void shuru(char text[]);
void bc(char text[]);
{
if (tmp=='A' || tmp=='a')
{
for(i=0;i<ntext;i++)
fprintf(fp,"%c",text[i]);
fclose(fp);
status=1;
printf("\n文件保存成功\n");
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);
}
while ((fp=fopen(name,"w+"))==NULL)
{
printf("文件不存在,请重新输入文件名:");
scanf("%s",name);
}
printf("\nA:确定;B:取消:");
while(scanf("%c",&tmp)!=EOF)
menu();
}
void bc(char text[])
{
system("cls");
FILE *fp;
char pd;
char tmp;
int i;
printf("\n输入【A】保存;任意键返回主菜单不保存\n");
fflush(stdin);
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");
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]=""; //文件保存的位置
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]) //继续匹配下一个字符
case '2': shu来自u(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;
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");
while ((fp=fopen(name,"r"))==NULL)
{
printf("\n打开文件失败,请重新输入要打开的文件名:");
scanf("%s",name);
}
cs(text);
while(!feof(fp))
{
ch=fgetc(fp);
goto loop;
}
if (pd=='R'||pd=='r')
{l=0;chazhao(text,l);}
}
void dayin(char text[])
{
system("cls");
printf("现在文本的内容为:\n");
printf("%s\n",text);
课题46:简易文本编辑器(2人)。要求:
1) 具有图形菜单界面;
2) 查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除;
3) 可正确存盘、取盘;
4) 正确显示总行数。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
printf("请输入内容(输入@结束输入并返回主菜单):\n");
printf("%s",text);
char c;
int i=ntext,j=ntext;
fflush(stdin);
while ((c=getchar())!='@')
相关文档
最新文档