Avatar billede heeelp Nybegynder
09. maj 2005 - 08:52 Der er 7 kommentarer og
1 løsning

Simpel textteditor

Hej.

Jeg er begyndt at lege lidt med noget C kode og skal i den forbindelse bruge en simpel teksteditor. Jeg har dog problemer med at lave redigeringsmodulet.

Jeg bruger nedenstående kode til at hente tekst fra en fil.

FILE *output

output = fopen (filNavn, "r");
if (output != NULL) {
  while(!feof(output)) {
      tegn = fgetc (output);
      if (!feof(output)) putchar(tegn);
  }
}

Mit problem består i, at jeg ikke kan finde ud at få det tekst jeg/brugeren skriver i promten ind i en fil.
Det skal virke sådan at man åbner/opretter en fil så manderefter redigerer i.

Programmet behøver kun at virke i windows og skal kun vise 5 linier af gangen og linierne må max være MAX_PR_LINE lange. Til at flytte markøren bruger jeg tasterne Å,Æ,Ø,*.

For at gøre det nemmest muligt vil jeg bare have at den indhente 1 karakter ad gangen og den skal kun printe de 5 linier. Så kan den bare printe ud hver kan man ændre i det. (Fx når man går 1 linie ned). Jeg lægger vægt på processerkraft.

Hvordan gør jeg det?
Avatar billede bertelbrander Novice
09. maj 2005 - 19:42 #1
Ren C kode? Konsol?
Avatar billede krismort Nybegynder
09. maj 2005 - 21:19 #2
Du kan lave det med kommandoerne:
kbhit og getch
hvor du enten skriver til en buffer eller til en file.
Avatar billede bertelbrander Novice
09. maj 2005 - 23:15 #3
Man kunne starte med:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

typedef enum
{
  UP_KEY = 72,
  DOWN_KEY = 80,
  RIGHT_KEY = 77,
  LEFT_KEY = 75,
  ESC_KEY = 27,
  ENTER_KEY = 13,
  BACKSPACE_KEY = 8,
  DELETE_KEY = 83
}KeyDef;

void GetText(char *aLines[], unsigned int aNumLines, unsigned int aLineLen)
{
  char ch;
  unsigned int CurrentLine = 0;
  unsigned int CurrentColumn = strlen(aLines[0]);
  unsigned int x, StartY = wherey();
  int Done = 0;

  for(x = 0; x < aNumLines; x++)
  {
      gotoxy(1, StartY + x);
      printf("%s", aLines[x]);
  }
  gotoxy(CurrentColumn + 1, StartY + CurrentLine);
  while(!Done)
  {
      ch = (char )getch();
      switch(ch)
      {
      case 0: // Special Keys
        switch(getch())
        {
        case UP_KEY:
            if(CurrentLine > 0)
            {
              CurrentLine--;
              CurrentColumn = strlen(aLines[CurrentLine]);
            }
            break;
        case DOWN_KEY:
            if(CurrentLine < aNumLines - 1)
            {
              CurrentLine++;
              CurrentColumn = strlen(aLines[CurrentLine]);
            }
            break;
        case LEFT_KEY:
            if(CurrentColumn > 0)
            {
              CurrentColumn--;
            }
            break;
        case RIGHT_KEY:
            if(CurrentColumn < strlen(aLines[CurrentLine]))
            {
              CurrentColumn++;
            }
            break;
        case DELETE_KEY:
            if(CurrentColumn < strlen(aLines[CurrentLine]))
            {
              memmove(aLines[CurrentLine] + CurrentColumn,
                      aLines[CurrentLine] + CurrentColumn + 1,
                      strlen(aLines[CurrentLine]) - CurrentColumn + 1);
              gotoxy(1, StartY + CurrentLine);
              printf("%*s", aLineLen, " ");
            }
            break;
        }
        break;
      case ENTER_KEY:
        if(CurrentLine < aNumLines - 1)
        {
            CurrentLine++;
            CurrentColumn = 0;
        }
        else
        {
            Done = 1;
        }
        break;
      case ESC_KEY:
        Done = 1;
        break;
      case BACKSPACE_KEY:
        if(CurrentColumn > 0)
        {
            CurrentColumn--;
            memmove(aLines[CurrentLine] + CurrentColumn,
                    aLines[CurrentLine] + CurrentColumn + 1,
                    strlen(aLines[CurrentLine]) - CurrentColumn + 1);
            gotoxy(1, StartY + CurrentLine);
            printf("%*s", aLineLen, " ");
        }
        break;
      default:
      {
        unsigned int Len;
        Len = strlen(aLines[CurrentLine]);
        if(Len < aLineLen - 2 && ch >= 32)
        {
            memmove(aLines[CurrentLine] + CurrentColumn + 1,
                    aLines[CurrentLine] + CurrentColumn,
                    Len - CurrentColumn + 1);
            aLines[CurrentLine][CurrentColumn] = ch;
            aLines[CurrentLine][Len + 1] = 0;
            CurrentColumn++;
        }
      }
      }
      gotoxy(1, StartY + CurrentLine);
      printf("%s", aLines[CurrentLine]);
      gotoxy(CurrentColumn + 1, StartY + CurrentLine);
  }
  gotoxy(1, StartY + aNumLines);
}

int main()
{
  char *Text[5];
  int i;
  for(i = 0; i < 5; i++)
  {
      Text[i] = malloc(70);
      sprintf(Text[i], "Line: %d", i);
  }
  GetText(Text, 5, 70);
  for(i = 0; i < 5; i++)
  {
      printf("You wrote: %s\n", Text[i]);
      free(Text[i]);
  }

  return 0;
}


Det kræver en kompiler der har getch(), gotoxy() og wherey(). Det har Borland, hvis du bruger en anden kompiler skal vi have lavet en erstatning for disse.
Avatar billede heeelp Nybegynder
10. maj 2005 - 10:16 #4
Hej

Det skal være ren C-kode. Jeg bruger Dev-C++ som kompiler. Den kender desværre ikke gotoxy() og wherey(), men getch() virker fint.
Avatar billede bertelbrander Novice
10. maj 2005 - 19:42 #5
En Dev-C++/MinGW/GCC version:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>

void gotoxy(short x, short y)
{
  HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  COORD Coord = {x - 1, y - 1};
  SetConsoleCursorPosition(StdOut, Coord);
}

short wherey(void)
{
  HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;
  GetConsoleScreenBufferInfo(StdOut, &ConsoleScreenBufferInfo);
  return ConsoleScreenBufferInfo.dwCursorPosition.Y + 1;
}

typedef enum
{
  UP_KEY = 72,
  DOWN_KEY = 80,
  RIGHT_KEY = 77,
  LEFT_KEY = 75,
  ESC_KEY = 27,
  ENTER_KEY = 13,
  BACKSPACE_KEY = 8,
  DELETE_KEY = 83
}KeyDef;

void GetText(char *aLines[], unsigned int aNumLines, unsigned int aLineLen)
{
  unsigned char ch;
  unsigned int CurrentLine = 0;
  unsigned int CurrentColumn = strlen(aLines[0]);
  unsigned int x, StartY = wherey();
  int Done = 0;

  for(x = 0; x < aNumLines; x++)
  {
      gotoxy(1, StartY + x);
      printf("%s", aLines[x]);
  }
  gotoxy(CurrentColumn + 1, StartY + CurrentLine);
  while(!Done)
  {
      ch = (char )getch();
      switch(ch)
      {
      case 224:
        switch(getch())
        {
        case UP_KEY:
            if(CurrentLine > 0)
            {
              CurrentLine--;
              CurrentColumn = strlen(aLines[CurrentLine]);
            }
            break;
        case DOWN_KEY:
            if(CurrentLine < aNumLines - 1)
            {
              CurrentLine++;
              CurrentColumn = strlen(aLines[CurrentLine]);
            }
            break;
        case LEFT_KEY:
            if(CurrentColumn > 0)
            {
              CurrentColumn--;
            }
            break;
        case RIGHT_KEY:
            if(CurrentColumn < strlen(aLines[CurrentLine]))
            {
              CurrentColumn++;
            }
            break;
        case DELETE_KEY:
            if(CurrentColumn < strlen(aLines[CurrentLine]))
            {
              memmove(aLines[CurrentLine] + CurrentColumn,
                      aLines[CurrentLine] + CurrentColumn + 1,
                      strlen(aLines[CurrentLine]) - CurrentColumn + 1);
              gotoxy(1, StartY + CurrentLine);
              printf("%*s", aLineLen, " ");
            }
            break;
        }
        break;
      case ENTER_KEY:
        if(CurrentLine < aNumLines - 1)
        {
            CurrentLine++;
            CurrentColumn = 0;
        }
        else
        {
            Done = 1;
        }
        break;
      case ESC_KEY:
        Done = 1;
        break;
      case BACKSPACE_KEY:
        if(CurrentColumn > 0)
        {
            CurrentColumn--;
            memmove(aLines[CurrentLine] + CurrentColumn,
                    aLines[CurrentLine] + CurrentColumn + 1,
                    strlen(aLines[CurrentLine]) - CurrentColumn + 1);
            gotoxy(1, StartY + CurrentLine);
            printf("%*s", aLineLen, " ");
        }
        break;
      default:
      {
        unsigned int Len;
        Len = strlen(aLines[CurrentLine]);
        if(Len < aLineLen - 2 && ch >= 32)
        {
            memmove(aLines[CurrentLine] + CurrentColumn + 1,
                    aLines[CurrentLine] + CurrentColumn,
                    Len - CurrentColumn + 1);
            aLines[CurrentLine][CurrentColumn] = ch;
            aLines[CurrentLine][Len + 1] = 0;
            CurrentColumn++;
        }
      }
      }
      gotoxy(1, StartY + CurrentLine);
      printf("%s", aLines[CurrentLine]);
      gotoxy(CurrentColumn + 1, StartY + CurrentLine);
  }
  gotoxy(1, StartY + aNumLines);
}

int main()
{
  char *Text[5];
  int i;
  for(i = 0; i < 5; i++)
  {
      Text[i] = malloc(70);
      sprintf(Text[i], "Line: %d", i);
  }
  GetText(Text, 5, 70);
  for(i = 0; i < 5; i++)
  {
      printf("You wrote: %s\n", Text[i]);
      free(Text[i]);
  }

  return 0;
}
Avatar billede heeelp Nybegynder
12. maj 2005 - 19:31 #6
Mange tak for hjælpen! Desværre lidt for sent til deadline, men du skal da ha' point alligevel
Avatar billede bertelbrander Novice
12. maj 2005 - 19:43 #7
Jeg samler ikke på point.
Avatar billede heeelp Nybegynder
14. juni 2005 - 15:01 #8
så må jeg jo ta' dem selv ....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



Seneste spørgsmål Seneste aktivitet
I går 17:10 Joomla artikler Af rmadsen80 i CMS-systemer
I går 16:54 Printervalg til kontor Af tumben i Printere
I går 15:08 Http client med X509Certificate2 Af joki i C#
I går 13:02 Hjemmenetværk Af Andfer i LAN/WAN
I går 11:17 Chrombook Af lurup i Andre styresystemer


White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis