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?
Annonceindlæg fra Capgemini
Du kan lave det med kommandoerne: kbhit og getch hvor du enten skriver til en buffer eller til en file.
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.
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.
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; }
Mange tak for hjælpen! Desværre lidt for sent til deadline, men du skal da ha' point alligevel
Jeg samler ikke på point.
så må jeg jo ta' dem selv ....
Kurser inden for grundlæggende programmering