et_schneid Geschrieben 11. Oktober 2003 Geschrieben 11. Oktober 2003 hi, ich bin dabei einen sehr einfachen texteditor zu schreiben, der in einer dos box laufen soll. ziel ist es die die funktionen append, print, insert und vielleicht load bzw. save bereitzustellen. append und print funktionieren schon, aber mit insert habe ich so meine probleme (das ganze beruht auf einer verketteten liste). bei insert sollen parameter uebergeben werden (fuer die zeilennummer, nach der ein einzugebener text eingefuegt werden soll) der aufruf fuer zB. das einfuegen einer weiteren zeile nach der zweite zeile eines textes soll per kommandozeile so erfolgen: *i2 (wobei 2 fuer die zeile steht) abspeichern sollte so erfolgen: *s wie macht man so etwas am besten?? danke fuer hilfe vorab! gruss, ed_schneid Zitieren
nic_power Geschrieben 11. Oktober 2003 Geschrieben 11. Oktober 2003 Hallo, das hört sich für mich nach einer stark abgespeckten Version des vi an . Was möchtest Du denn genau wissen? Wie das ganze programmiertechnisch zu lösen ist (und wenn ja, was: das einlesen der Kommandos, die Verwaltung Deiner Liste)? Insert sollte kein Problem sein, Du musst nur an der entsprechenden Stelle Deiner Liste eine bestimmte Anzahl zusätzlicher Elemente einfügen (die Anzahl entspricht der Anzahl der einzufügenden Zeilen). Das kannst Du entweder "on the fly" machen oder Du legst vorher eine weitere Liste an, die nur die neuen Zeilen enthält und fügst diese dann ein. Beim Speichern schreibst Du die Elemente der Reihe nach auf Festplatte, bis Du ans Ende der Liste gelangst. Nic Zitieren
et_schneid Geschrieben 11. Oktober 2003 Autor Geschrieben 11. Oktober 2003 Hi, genau das soll es sein, eine abgespeckte version von VI :-) Ich gehe jetzt mal genauer auf die Struktur ein: DNode ist die Listenklasse: Deklaration #ifndef DLIST_H #define DLIST_H #include "SString.h" class DList; // forward declaration class DNode { public: DNode(); DNode(SString *pM); ~DNode(); void print(); private: // DNode *pPrev; SString *pWaarde; DNode *pNext; friend class DList; }; class DList { public: DList(void); ~DList(void); void push_back(SString *pP); void print(); protected: void setRunner(unsigned int i); void insert(SString *pP); private: DNode *pHead; DNode *pTail; DNode *pRunner; unsigned int index; unsigned int size; }; #endif [/PHP] [b]Definition[/b] [PHP] #include <iostream.h> #include "DList.h" DNode::DNode() { // pPrev=NULL; pWaarde=NULL; pNext=NULL; } DNode::DNode(SString *pM) { // pPrev=NULL; pWaarde=pM; pNext=NULL; } DNode::~DNode() { delete pWaarde; } void DNode::print() { pWaarde->print(); } DList::DList(void) { pHead = new DNode; pTail = new DNode; pHead->pNext = pTail; // is possible because DList // pTail->pPrev = pHead; // is a friend of DNode size = 0; index = 0; pRunner = pHead; } DList::~DList(void) { pRunner = pHead; while (pRunner != NULL) { pHead = pHead->pNext; delete pRunner; pRunner = pHead; } } void DList::setRunner(unsigned int i) { index = 0; pRunner = pHead; while (index!=i) { pRunner = pRunner->pNext; index++; } } void DList::insert(SString *pM) { DNode *pK = new DNode(pM); pK->pNext = pRunner->pNext; // pK->pNext->pPrev = pK; // pK->pPrev = pRunner; pRunner->pNext = pK; size++; } void DList::push_back(SString* pM) { setRunner(size); insert(pM); } void DList::print() { DNode *pRunner; pRunner = pHead->pNext; while (pRunner->pWaarde!=NULL) { pRunner->print(); pRunner = pRunner->pNext; } } SString ist die Stringklasse: Deklaration class SString { public: SString(char *ps); SString(); SString(const SString &str); ~SString(); void print(); void and(SString stringx); void set(SString stringy); char* get(); private: int len; char *p; char *q; }; [/PHP] [b]Definition[/b] [PHP] #include <iostream.h> #include <string.h> #include <stdlib.h> #include "SString.h" SString::SString(char *ps) { len = strlen(ps); p = new char[len + 1]; strcpy(p, ps); }; SString::SString(){ char *ps = ""; len = strlen(ps); p = new char[len + 1]; strcpy(p, ps); }; SString::SString(const SString &str){ len = str.len; p = new char[len + 1]; strcpy(p, str.p); } SString::~SString() { delete [] p; } void SString::print() { cout << p << endl; } void SString::and(SString stringx){ int b=strlen(stringx.p); b = b + strlen(p) + 1; q = new char[strlen(p)]; strcpy(q,p); delete [] p; p = new char[b]; strcpy (p,q); strcat(p, stringx.p); } void SString::set(SString stringy){ delete [] p; p = new char[strlen(stringy.p) + 1]; strcpy(p, stringy.p); } char* SString::get(){ return p;} Die "main": #include "dlist.h" #include "stdlib.h" #include "iostream" int main() { DList l; char test[60]; cout << "Prompt: "; for (int i=0; i<5; i++) { cin >> test; l.push_back(new SString (test)); } l.print(); system("PAUSE"); return 0; } [/PHP] Push_back und print funktionieren, allerdings weiss ich nicht genau, wie ich weitermachen soll. Es ist in jedem Fall notwendig, dass ich die Eingabe abspeichern bzw. laden muss. Bei einer geladenen Datei sollte ein Insert ueber einen Trigger "i" mit nachfolgendem Parameter der Zeilennummer moeglich sein, prinzipiell muss also eine Zeile angefuegt werden. Wie sieht beispielhaft dafuer die main aus? Danke vorab und Gruss, ed_schneid Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.