首页 C语言 文本编辑器(已处理)

C语言 文本编辑器(已处理)

举报
开通vip

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 0x1c0...

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;/*由此类型节点构成的单链 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf ,命名为:列单链表*/ 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 '*' ; /*若为回车键,打印出*号*/ else putch p- ch ; /*输出各行中的字符到预览窗口*/ p p- next; /*指向下一个节点*/ q q- nextl; /*指向下一个节点*/ printf "\n" ;/*输出一个回车*/ 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 m;i++ /*定位至行单链表中的第m个元素*/ q q- nextl; p q- next;/*获取第m个节点的数据域*/ for i 1;i n;i++ /*定位至列单链表中的第n个元素*/ 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 m;i++ /*定位至行单链表中的第m个元素*/ 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 m;i++ /*定位至行单链表中的第m个元素*/ q q- nextl; p1 q- next; for i 1;i n-1;i++ /*定位至列单链表中的第n-1个元素*/ 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 n;i++ /*定位至行单链表中的第n个元素*/ 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 m;i++ /*定位至行单链表中的第m个元素*/ q q- nextl; p1 q- next; for i 1;i n-1;i++ /*定位至列单链表中的第n-1个元素*/ 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 abs value ;i++ /*value为数组下标*/ 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; 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 "\n open file error!\n" ; getchar ; return ; do p q- next; /*指向node类型的数据*/ while p! NULL if int p- ch 13 fputc '\n',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 "\n open file error!\n" ; getchar ; return ; do p q- next; /*指向node类型的数据*/ while p! NULL if int p- ch 13 fputc '\n',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 ; void main char a; int i,A,x,y,flag 0,b; Hnode *Hhead,*q; node *p1,*p2; Hhead Hnode * malloc sizeof Hnode ; /*为行单链表中首节 点分配内存空间*/ q Hhead; Hhead- nextl NULL; p1 p2 q- next node * malloc sizeof node ; /*为列单链表 中首节点分配内存空间*/ p1- ch 13; p1- next NULL; drawmain ; /*显示主窗口*/ window 2,2,79,23 ; textbackground 9 ; for i 0;i 24;i++ insline ; window 3,3,78,23 ; textcolor 10 ; while 1 while bioskey 1 0 continue; /*等待用户按键*/ a A bioskey 0 ; /*返回输入的字符的键值*/ if a 32&&a 127 /*若输入为常规字符或回车键*/ if check Hhead,wherey ,wherex 0 /*当前位 置没有字符且输入是常规字符,则执行添加字符操作*/ NUM++; p2- ch a; putch a ; if NUM 76 /*连续输入满行,分别生成一 个新的行单链表和列单链表节点*/ p2- next NULL; q- nextl Hnode * malloc sizeof Hnode ; q q- nextl; q- nextl NULL; q- next NULL; p1 p2 q- next node * malloc sizeof node ; p1- ch 13; p1- next NULL; NUM 0; else /*连续输入未满一行,生成一个新的 列单链表节点*/ p2- next node * malloc sizeof node ; p2 p2- next; p2- ch 13; p2- next NULL; else /*当前位置有字符且输入是常规字符,则执 行插入字符操作*/ x wherex ; y wherey ; insert Hhead,wherey ,wherex ,a ; NUM++; view Hhead ; gotoxy x,y ; /*若输入为回车键*/ if a 13 gotoxy 1,wherey +1 ; q- nextl Hnode * malloc sizeof Hnode ; q q- nextl; q- nextl NULL; q- next NULL; p1 p2 q- next node * malloc sizeof node ; p1- ch 13; p1- next NULL; NUM 0; x wherex ; y wherey ; /*文本窗口中左移,当前光标不在窗口的第1列*/ if A LEFT && x! 1 gotoxy wherex -1,wherey ; /*文本窗口中左移,当前光标在窗口的第1列*/ if A LEFT && x 1 gotoxy abs judge Hhead,wherey -1 ,wherey -1 ; /*文本窗口中右移,若当前光标的右边一位有字符*/ if A RIGHT &&check Hhead,wherey ,wherex 0 gotoxy wherex +1,wherey ; /*文本窗口中右移至下行的第1列,若当前光标位置没有 字符且下行的第1列有字符*/ if A RIGHT &&check Hhead,wherey +1,1 ! 0&&check Hhead,y,x 0 gotoxy 1,wherey +1 ; /*右移*/ if A RIGHT &&x 76 gotoxy 1,wherey +1 ; /*上移*/ if A UP &&check Hhead,wherey -1,wherex ! 0 gotoxy wherex ,wherey -1 ; /*上移*/ if A UP &&check Hhead,wherey -1,wherex 0 if judge Hhead,wherey -1 0 gotoxy -judge Hhead,wherey -1 +1,wherey -1 ; else gotoxy -judge Hhead,wherey -1 ,wherey -1 ; /*下移*/ if A DOWN &&check Hhead,wherey +1,wherex ! 0 gotoxy wherex ,wherey +1 ; /*处理BackSpace键*/ if A BACK /*处理BackSpace键*/ flag del Hhead,wherey ,wherex -1 ; x wherex -1; y wherey ; view Hhead ; if flag 0 if x! 0 gotoxy x,y ;
本文档为【C语言 文本编辑器(已处理)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_841159
暂无简介~
格式:doc
大小:69KB
软件:Word
页数:32
分类:
上传时间:2017-09-23
浏览量:66