Премини към съдържанието
Fa7al1ty

Програма - текстов редактор

Препоръчан отговор


Здравейте,

Както гласи заглавието имам малко проблеми със следната задача :

 

Произволен текст е поместен в текстов файл .Да се напише програма-редактор,която въз основа на файла F, команди и данни от клавиатурата създава нов файл.Програмата - редактор трябва да разпознава и обработва следните команди:AN-вмъкване на текст след n-тия ред;IN- вмъкване на текст преди n-тия ред;CM,N-заместване на редовете от m-ти до n-ти;DM,N-изтриване на редове от от m-ти до n-ти;E-край на редактирането.Където’ m’ и ‘n’ са номера на редовете от файла F.Командите се записват по една на ред.Данните за командите се задават в редовете, непосредствено след тях се завършва с празен ред.Поредицата от команди се задават в нарастващ ред на номерата на редовете.Командите за редове се подават в отделен ред.

 

До момента написах това (не обръщайте внимание на недописаните функции и меню ще ги добавя по-късно):

    #include <iostream>    #include <conio.h>    #include <fstream>    #include <string>    using namespace std; 	const int N=255;	int vmykvaneP (string mas[]);	int vmykvaneS (string mas[]);	void zamestvane (string mas[]);	int iztrivane (string mas[]);    int main()    {   		int ans;		ifstream file("myfile.txt"); 		ofstream file2("myfile2.txt");		file2<<file.rdbuf();		file.close();		file2.close();		do {		string massive[N];        string prom;        ifstream file;        file.open("myfile2.txt" , ios::in);        int i=0;        while(!file.eof())        { getline(file, prom);          massive[i]=prom;		  i++;}			cout<<"Vyvedete svoq izbor"<<endl;			cout<<"1.Vmykvane na tekst predi n-tiq red."<<endl;			cout<<"2.Vmykvane na tekst sled n-tiq red."<<endl;			cout<<"3.Zamestvane na redovete ot m-ti do n-ti."<<endl;			cout<<"4.Iztrivane na redovete ot m-ti do n-ti."<<endl;			cout<<"5.Krai na redaktiraneto."<<endl;						cin>>ans;			switch(ans){			case 3: zamestvane(massive);break;			case 5:exit(1);			}		}		while(ans!=5);	}	void zamestvane (string mas[]){		string swap;		int n,m;		cout<<"Posochete redovete koito iskate da bydat zameneni"<<endl;		cout<<"Ot :";		cin>>n;		n=n-1;		cout<<endl<<"Do :";		cin>>m;		m=m-1;		for (n ; n<=m ; n++){			cout<<endl<<"Vyvedete tekst za ("<<n+1<<")red: "<<endl;			cin>>mas[n];		}		ofstream file2("myfile2.txt",ios::in);		for (int i=0 ; i<=N; i++){		file2<< mas[i]<<endl;		}	}

Единственият ми проблем са тези добавяния на текст преди/след определен ред. Как точно може да стане, имам предвид как мога да направя, така че да се увеличи номера на всеки следващ ред, поне ако съм разбрал задачата правилно. Ако някой има време и знае как се получава кодът или поне някакви насоки, които могат да помогнат моля да сподели. Не е задължително да е по задачата, може и с примери. Благодаря предварително за отделеното време.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Очевидно, идеята е да правиш поредов редактор, т.е. най-малката единица, която може да редактираш е ред.Много лесно ще се получи, ако си прочетеш отначало всички редове на файла в един вектор или списък от низове (string). И в двете може да вмъкваш и триеш динамично. Списъкът е много по-ефективен при това, но по-бавно се търси N-ти ред, а вектора вмъква и трие бавно, но винаги знаеш, кой ред къде е. Накрая, записваш списъка в новия файл.

  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Добре, справих се с програмата до някъде. Единственият ми проблем е изтриването на редове. Когато използвам само изтриване и приключа с редактирането, командата си работи както трябва. Но когато използвам някоя друга от командите заедно с изтриване, ми дава грешка. Например ако реша да добавя ред и след това да изтрия някой друг ред, без да съм приключил с редакцията/програмата, ми дава грешка.

Ето я и нея:

    #include <iostream>    #include <conio.h>    #include <fstream>    #include <string>    using namespace std; 	const int N=255;	void vmykvaneP (string mas[]);	void vmykvaneS (string mas[]);	void zamestvane(string mas[]);	void iztrivane (string mas[]);    int main()    {   		int ans;		ifstream file("myfile.txt"); 		ofstream file2("myfile2.txt");		file2<<file.rdbuf();		file.close();		file2.close();		do {		string massive[N];        string prom;        ifstream file;        file.open("myfile2.txt" , ios::in);        int i=0;        while(!file.eof())        { getline(file, prom);          massive[i]=prom;		  i++;}			cout<<"Vyvedete svoq izbor"<<endl;			cout<<"1.Vmykvane na tekst predi n-tiq red."<<endl;			cout<<"2.Vmykvane na tekst sled n-tiq red."<<endl;			cout<<"3.Zamestvane na redovete ot m-ti do n-ti."<<endl;			cout<<"4.Iztrivane na redovete ot m-ti do n-ti."<<endl;			cout<<"5.Krai na redaktiraneto."<<endl;						cin>>ans;			switch(ans){			case 1: vmykvaneP (massive);break;			case 2: vmykvaneS (massive);break;			case 3: zamestvane(massive);break;			case 4: iztrivane (massive);break;			case 5:exit(1);			}		}		while(ans!=5);	}	void zamestvane (string mas[]){		int n,m;		cout<<"Posochete redovete, koito iskate da bydat zameneni !"<<endl;		cout<<"Ot :";		cin>>n;		n=n-1;		cout<<endl<<"Do :";		cin>>m;		m=m-1;		cin.ignore(INT_MAX, 'n');		for (n ; n<=m ; n++){			cout<<endl<<"Vyvedete tekst za ("<<n+1<<")red: "<<endl;			getline(cin,mas[n]);		}		ofstream file2("myfile2.txt",ios::in);		for (int i=0 ; i<=N; i++){		file2<< mas[i]<<endl;		}	}	void iztrivane (string mas[])	{		int n,m;		cout<<"Vyvedete redovete, koito iskate da bydat iztriti !"<<endl;		cout<<"Ot :";		cin>>n;		n=n-1;		cout<<endl<<"Do :";		cin>>m;		m=m-1;		for ( n ; n<N-5 ; n++){			m++;			mas[n]=mas[m];		}		ofstream file2("myfile2.txt",ios::in);		for (int i=0 ; i<=N; i++){		file2<< mas[i]<<endl;		}	}	void vmykvaneP (string mas[])	{		int n;		string swap[N];		for (int i=0 ; i<N ; i++){			swap[i]=mas[i];		}		cout<<"Posochete reda, predi koito shte vyvejdate text !"<<endl;		cin>>n;		n=n-1;		cout<<"Vyvedete text za reda : ";		cin.ignore(INT_MAX, 'n');		getline (cin, mas[n]);		for ( n ; n<N ; n++){			mas[n+1]=swap[n];		}		ofstream file2("myfile2.txt",ios::in);		for (int i=0 ; i<=N; i++){		file2<< mas[i]<<endl;	}	}	void vmykvaneS (string mas[]) {		int n;		string swap[N];		for (int i=0 ; i<N ; i++){			swap[i]=mas[i];		}		cout<<"Posochete reda, sled koito shte vyvejdate text !"<<endl;		cin>>n;		cout<<"Vyvedete text za reda : ";		cin.ignore(INT_MAX, 'n');		getline (cin, mas[n]);		for ( n ; n<N-1 ; n++){			mas[n+2]=swap[n+1];		}		ofstream file2("myfile2.txt",ios::in);		for (int i=0 ; i<=N; i++){		file2<< mas[i]<<endl;	}	}
Редактирано от Fa7al1ty (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.