Edytor tekstowy C++

0

Witam, mam pewien problem muszę do jutra napisać "prosty" edytor tekstowy w konsoli coś na zasadzie notatnika..
Program powinien wczytać tekst z pliku potem można go edytować i dopisać coś lub skasować w każdym miejscu a na koniec zapisać zmiany z powrotem do pliku.. niestety jestem początkującym i mam duży problem z poruszaniem się kursorem po konsoli
napisałem coś takiego

 	#include <iostream>
    #include <fstream>
    #include <string>
    #include <conio.h>
	#include <windows.h>
    using namespace std;
     
    int openfile(); // funkcja otwierająca plik
    int newfile(); // funkcja tworząca nowy plik
	int editfile();
     
        string   fileopen; // nazwa pliku do otwarcia
        string   createfile; // nazwa tworzonego pliku
        string   text; // zawartość pliku
        ofstream outfile; // plik wyjciowy
        ifstream infile; // plik wejsciowy
		char c, str[256];
		ifstream is;
		const int n=500;


	void gotoxy(int x, int y)
	{
		COORD c;
		c.X = x - 1;
		c.Y = y - 1;
		SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
	}

	void WyswietlKomunikaty()
{
    
    gotoxy( 1, 24 );
    cout << "[ESC] Wyjscie    ";
    cout << "[GORA/DOL/PRAWO/LEWO] Poruszanie sie po konsoli  ";
    gotoxy( 1, 25 );
    cout << "[CTRL+ENTER] Dopisz  ";
	cout << "[DELETE] Kasuj ";
    cout << "[ENTER] Zatwierdz zmiany   ";
 
    return;
}
    int main()
    {
		int pozycja,znak;
		bool koniec = false;
        while( true )
		{
			char    opcje;
			do
			{

				system("cls");
				cout <<"[1] Otworz plik      \n" ;
				cout <<"[2] Edytowanie      \n" ;
				cout <<"[3] Nowy plik        \n" ;
				cout <<"[4] Wyjscie          \n" ;
				opcje =getch();
       
				switch(opcje)
				{
					  case '1':
					  {
						  openfile();
					  }
					  break;
					 case '2':
					  {
						  editfile();
					  }
					  break;
					  case '3':
					  {
						  newfile();
					  }
					  break;
					 case 224: //klawisze specjalne
						znak = getch();
						switch( znak )
						{
						case 72: //strzałka w górę
							break;
						gotoxy (1,0);
	
						case 80: //strzałka w dół
						gotoxy (-1,0);
		
							break;
						case 75: //strzałka w lewo
						gotoxy (0,-1);
		
							break;
						case 77: //strzałka w prawo
							gotoxy (0,1);
						case 83: //klawisz delete
						;
						break;
						}
						znak = 0;
						break;
						case 10: //CTRL+ENTER
            
           
						break;
						case 13: //ENTER
          
           
						break;
						case 27: //ESC
						koniec = true;
						break;
				}
			}
        while(opcje != '4');
        return 0;
		}
    }
     
    int openfile()
    {

		int  i;
		char file,esc;
        system("cls");
		cout <<"\t\t    OTWIERANIE PLIKU       " <<endl<< endl;
    	cout << "Podaj nazwe pliku ktory chcesz otworzyc: ";
		cin.get (str,256);
		cout << " " << endl;
		cout <<"\t\t*************************" <<endl;
		is.open (str);      

		if (is.is_open())
			{
				while (is.good())  
				{
					c = is.get();   
					if (is.good())
					{
						cout << c;
					}
				}
				is.close();
			}
		else
			{
				cout <<"Podany plik nie istnieje!";
			}
																	
		while( true )
		{
			char    opcje;
			do
			{
				cout << " " << endl;
				cout << " " << endl;
				cout << " Czy chcesz przejsc do edycji tego tekstu? ";
				cout <<"[1] Tak / [2] NIE        \n" ;
				 
				opcje =getch();

				switch(opcje)
				{
					case '1':
					{
						system("cls");
						editfile();
					}
					break;
				}
			}
		while(opcje != '1' & '2');
        return 0;
		}
	}
	int editfile ()
	{
		char tekst[n];
		int i;
		string slowo;
		cout <<"\t\t    EDYCJA PLIKU       " <<endl<< endl<<endl;
		ofstream plik;
		plik.open ("dane.txt", ios::out|ios::in);
		plik.seekp(-1,ios::end);
		is.open (str);      
		if (is.is_open())
		{
			while (is.good())  
			{
				c = is.get();   
				if (is.good())
				{
					cout << c;
				}
			}
			is.close();
		}
		else
			{
				cout <<"Podany plik nie istnieje";
			}
			while( true )
			{	
				char    opcje2;
				do
				{
					cout << " " << endl<<endl;
					cout << " Czy chcesz cos dopisac ";
					cout <<"[1] Tak / [2] NIE        \n" <<endl;
					opcje2 =getch();
					switch(opcje2)
					{
						case '1':
						{
							cout << "\nPodaj tekst, kazde zdanie powinno byc oddzielone kropka\n";
							cin.getline(tekst,n);
							for(i=0;i<=n;i++)
							{ 
								if (tekst[i]=='.')
								{ 
									plik << tekst[i] << endl;
									i++;
								}
								else plik << tekst[i];
								if (!tekst[i]) break;
							}
						}
						break;
					}

				}
			while(opcje2 != '2');
		WyswietlKomunikaty();          
								plik.close(); 
		system ("Pause") ;
		return 0;
		}
	}
   int editfile(int argc, char *argv[])
	{
	 bool koniec = false;
		while( koniec == false )
		{
			unsigned char znak = getch();
			switch( znak )
		    {
				int slowo; 
				case 224: 
				znak = getch();
				switch( znak )
				{
					case 72: //strzałka w górę
						break;
					gotoxy (1,0);
	
					case 80: //strzałka w dół
					gotoxy (-1,0);
		
						break;
					case 75: //strzałka w lewo
					gotoxy (0,-1);
		
						break;
					case 77: //strzałka w prawo
						gotoxy (0,1);
						break;
				}
					znak = 0;
					break;

					case 13: //ENTER
						break;

					case 27: //ESC
					koniec = true;
						break;
        }
    }
	return 0;
   }
     
    int newfile()
    {
       
        system("cls");

        cout <<"\t\t TWORZENIE PLIKU      " <<endl;
        cout <<" Podaj nazwe pliku:  "; getline(cin,createfile);
        cout <<"\t\t*********************" <<endl;
       
           
        getline(cin,text,'\2');
           
       
        outfile.open((createfile+".txt").c_str());
        outfile << text <<endl;
        outfile.close();

       return 0;
    }
 

Pierwszy problem jest taki, że dopisywać można tylko na końcu tekstu.. po drugie nie wiem jak kasować tekst

case '3':
	{
		gotoxy( 1, 15); //przejscie na pozycje x, y
		cout << "                                                                " << endl;
		cout << "                                                                "<< endl;
	}
	break; 

dopisałem coś takiego ale niestety to tylko zamazuje linie w konsoli a nie w pliku
Trzeci i najważniejszy problem to wspomniane wcześniej poruszanie się kursora funkcja gotoxy np (0,1) nie spowoduje przesunięcia kursora o jedno miejsca w górę tylko na samą górę tak jakby konsola bo układ współrzędnych.. domyślam się, że trzeba jakoś określić dokładnie położenie kursora i np dodać do tego +1, a także jakoś odświeżać tekst za każdym takim ruchem?
Z góry dzięki za każdą pomoc...

0

Masz straszny bałagan w kodzie oraz źle się do tego zabierasz (nie możesz tego ot tak edytować w konsoli).
Mój pomysł wyglądałby raczej mniej-więcej tak (to nie jest kompletny kod, bardzo dużo trzeba dopisać ale chodzi o sam 'algorytm').

#include <string>
#include <conio.h>
#include <windows.h>
#include <cstdio>

using namespace std;

struct text_data
{
    list<string> text;
}

struct editor_data
{
    list<string>::iterator line;
    string::iterator cursor;
}

text_data readFile(string path); // read file
editor_data initEditor(text_data); // set line and cursor
void editorMainLoop();
void drawTextToConsole(); // clear screen, draw lines
void saveFile(text_data); // save file

int main()
{
    text_data text = readFile("D:\\tst.txt");
    editor_data = initEditor(text);

    editorMainLoop();

    saveFile(text);

    return 0;
}

void editorMainLoop(text_data text, editor_data edit)
{
    while(true)
    {
        char in = getch();
        switch(in)
        {
            case UP_ARROW:
            { 
                edit.line--; 
                edit.cursor = line.begin(); // set cursor to current line
                break;
            }
            case DOWN_ARROW:
            {
                edit.line++;
                edit.cursor = line.begin();
                break;
            }
            case LEFT_ARROW: { edit.cursor--; break; }
            case RIGHT_ARROW: { edit.cursor++; break; }
            case ENTER:
            {
                edit.line = insert(text.text // insert new line
                        ++edit.line // before current
                        ""); // empty line
            }
            case EXIT:
            { return; }
            default:
            {
                cursor = insert(cursor, in);
            }
            drawTextToConsole(text);
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1