亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言如何實現文本編輯器系統

發布時間:2021-05-28 12:25:55 來源:億速云 閱讀:173 作者:小新 欄目:編程語言

小編給大家分享一下C語言如何實現文本編輯器系統,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

 本文實例為大家分享了C語言實現文本編輯器系統的具體代碼,供大家參考,具體內容如下

/*文本編輯器editor源代碼*/


#include <stdio.h>
#include <conio.h>
#include <bios.h>
#include <math.h>
#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('*'); /*若為回車鍵,打印出*號*/
          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);
              else gotoxy(x+1,y);
           }
            if(flag==1)
           {
              gotoxy(x+1,y);
              flag=0;
           }
        }
        /*處理菜單按鍵F1 F2 F3*/
        if((A==F1)||(A==F2)||(A==F3)||(a<32||a>127))
        {  A=menuctrl(Hhead,A);
         if(A==100){main();} /*新建文件*/

         if(A==101){ /*打開文件*/
          Hhead=(Hnode *)malloc(sizeof(Hnode));
          opens(Hhead);
          getchar();clrscr();gotoxy(3,3);view(Hhead);
          }
        /*保存文件*/
         if(A==102){save(Hhead);clrscr();cprintf("save successfully!");getch();gotoxy(3,3);view(Hhead);}
        /*文件另存為*/
         if(A==103){saveas(Hhead);clrscr();cprintf("save as successfully!");getch();gotoxy(3,3);view(Hhead);}
        /*幫助*/
         if(A==120){clrscr();cprintf("<Help> F1:File F2:Edit F3:Help ");
              getch();gotoxy(3,3);view(Hhead);}
         if(A==121){clrscr();cprintf("Abort:Version 2.0 Tel:XXXXXXXXXX");getch();gotoxy(3,3);view(Hhead);}
        }

        /*處理DEL鍵,刪除當前位置的單個字符*/
        if(A==DEL)
        {
           x=wherex();  y=wherey();
           del(Hhead,wherey(),wherex());
           view(Hhead);
           gotoxy(x,y);
        }
        /*處理已經選定文本字符后,按DEL鍵的情況*/
        if(A==DEL&&value!=0)
        {
           if(value>0)
              x=wherex(),  y=wherey();
           else
              x=r[0].col, y=r[0].line;
           for(i=0;i<abs(value);i++)
           {
              if(value>0)
               del(Hhead,r[i].line,r[i].col);
              if(value<0)
               del(Hhead,r[abs(value)-1-i].line,r[abs(value)-1-i].col);
           }
           value=0; /*此value為全局變量*/
           view(Hhead);
           gotoxy(x,y);
        }
       /*處理Ctrl+x按鍵*/
       if(A==Cx&&value!=0)
        {
           if(value>0)
              x=wherex(),  y=wherey();
           else
              x=r[0].col, y=r[i].line;
           for(i=0;i<abs(value);i++)
           {
              if(value>0)
               del(Hhead,r[i].line,r[i].col);
              if(value<0)
               del(Hhead,r[abs(value)-1-i].line,r[abs(value)-1-i].col);
           }
              backup=value; /*保存r數組的有值元素的最大下標值*/
              value=0; /*此value為全局變量*/
              view(Hhead);
              gotoxy(x,y);
        }

        /*處理Ctrl+c按鍵*/
        if(A==Cc&&value!=0)
        {
           x=wherex();   y=wherey();
           backup=value;  value=0; /*此value為全局變量*/
           view(Hhead);
           gotoxy(x,y);
        }

        /*處理Ctrl+v按鍵*/
        if(A==Cv&&backup!=0)
        {
           x=wherex();  y=wherey();
           if(backup<0) /*Ctrl+右移鍵選定的文本,貼切此當前位置*/
              for(i=0;i<abs(backup);i++)
                insert(Hhead,y,x+i,r[i].ch);/*逐個插入*/


           if(backup>0) /*Ctrl+左移鍵選定的文本,貼切此當前位置*/
              for(i=0;i<backup;i++)
                insert(Hhead,y,x+i,r[backup-1-i].ch);

           view(Hhead);
           gotoxy(x,y);
        }
        /*快速預覽*/
        if(A==F10)
        {
            qview(Hhead);
            view(Hhead);
            gotoxy(x,y);
        }

        /*處理Ctrl+左移鍵或右移鍵*/
        if(A==CL||A==CR)  control(A,Hhead);
        /*顯示當前行列號*/
        x=wherex();  y=wherey();
        window(1,1,80,25);
        textcolor(0);
        textbackground(7);
        gotoxy(10,25); /*第25行,第10列,輸出當前行號wherey()*/
        cprintf("%-3d",y);
        gotoxy(24,25); /*第25行,第24列*/
        cprintf("%-3d",x);
        window(3,3,78,23);
        textcolor(10);
        gotoxy(x,y);
        textcolor(10);
        textbackground(1);
    }
 }

以上是“C語言如何實現文本編輯器系統”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大厂| 安丘市| 防城港市| 施甸县| 桃江县| 天全县| 武义县| 阿拉尔市| 东平县| 永昌县| 安福县| 丽江市| 阿尔山市| 信阳市| 荆州市| 蓬安县| 遵义县| 清河县| 新巴尔虎左旗| 台安县| 长海县| 河间市| 牙克石市| 德清县| 河曲县| 莎车县| 吐鲁番市| 和平县| 瓦房店市| 体育| 雷州市| 开封市| 静海县| 通山县| 大名县| 建瓯市| 且末县| 凌源市| 潜江市| 布拖县| 唐山市|