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...