Powłoka systemowa - dodanie funkcji

0

Witam. Jestem straszna noga z programowania a dostałem za zadanie dodać do tej "powłoki systemowej" parę funkcji np. tworzenie, kasowanie, edytowanie plików czy też "rysowanie" równoległoboku (cokolwiek to znaczy). Prosiłbym Was o pomoc, bo nie wiem jak się za to zabrać. Dodałem niby tą funkcję "rysuj trójkąt" wzorując się na innych, ale już reszty to nie wiem jak zrobić.

#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/types.h>
#include <dirent.h>
#include <fstream>
#include <sstream>

using namespace std;

string WczytajSciezke();
string polecenie;
string domowy = WczytajSciezke();
const char * domowyKatalog = domowy.c_str();

//*****************************************************************************************

string WczytajSciezke(){
	char *buffer = new char[256];
	getcwd(buffer,256);
	if(buffer != NULL){
		string ret(buffer);
		delete[] buffer;
		return ret;
	}else{
		delete[] buffer;
		return string();
	}
}
void pwd()
{
	cout << WczytajSciezke() <<endl;
}

void cd(string parametr2)
{
	const char *par2=parametr2.c_str();
	if (parametr2 == "")
		chdir(domowyKatalog);
	else{
		chdir(par2);

	}

}
void ls()
{
	DIR *dpdf;
	struct dirent *epdf;
	dpdf = opendir("./");
	if (dpdf != NULL){
		while (epdf = readdir(dpdf)){
			cout << epdf->d_name << endl;
		}
	}
}
void kopiuj(string par2,string par3)
{
	ifstream plik1 (par2.c_str(), fstream::binary);
	if (!plik1.good() )
		cout << "Plik nie istnieje" <<endl;
	else {
		ofstream plik2 (par3.c_str(), fstream::trunc|fstream::binary);
		if(!plik2.good())
			cout << "Nie mozna otworzyc pliku do zapisu" << endl;
		else{
			plik2 << plik1.rdbuf ();
			plik1.close();
			plik2.close();
			cout << "Zrobione" << endl;
		}
	}
}
void rysuj_trojkat()
{
  for(int i=5;i>=0;i--){
        for(int j=i;j>=0;j--)
            cout << " ";
        for(int j=i;j<5;j++)
            cout << "*";
        cout << "\n";
    }
}
void polacz(string in1,string in2,string out)
{
	ifstream plik1 (in1.c_str(), fstream::binary);
	ifstream plik2 (in2.c_str(), fstream::binary);

	if (!plik1.good())
		cout << "Plik "<< in1 << "Nie istnieje lub nie mozna uzyskac dostepu "<< endl;
	else if (!plik2.good())
		cout << "Plik "<< in2 << "Nie istnieje lub nie mozna uzyskac dostepu "<< endl;
	else {

		ofstream plik3 (out.c_str(), fstream::trunc|fstream::binary);
		if(!plik3.good())
			cout << "Nie mozna otworzyc pliku do zapisu" << endl;
		else{
			plik3 << plik1.rdbuf ();
			plik3 << plik2.rdbuf();
			plik1.close();
			plik2.close();
			plik3.close();
			cout << "Zrobione" << endl;
		}
	}
}

void wypisz(string inp)
{
	ifstream plik1 (inp.c_str(), fstream::in);
	if (!plik1.good() )
		cout << " Plik nie istnieje lub brak dostepu " <<endl;
	else {
		cout << plik1.rdbuf ();
		cout<<endl;
		plik1.close();
	}
}
void pomoc()
{
	cout << "Mozliwe komendy do wpisania"<< endl;
	cout << "'cd' 'ls' 'pwd' 'kopiuj' 'pomoc' 'polacz' 'wypisz' 'rysuj_trojkat'"<<endl;
	cout << "<komenda> --pomoc (Wyswietla pomoc do danej komendy)"<<endl;
	cout << "zakoncz -konczy dzialanie programu "<< endl;
}

int main()
{
	vector <string> historia;
	pomoc();
	cout <<endl;
	while((polecenie !="zakoncz") && (polecenie !="zakoncz")){
		cout << WczytajSciezke() <<" -> ";
		getline(cin,polecenie);

		string parametr_1, parametr_2, parametr_3,parametr_4,parametr_5;
		istringstream StrStream(polecenie);

		StrStream >> parametr_1;
		StrStream >> parametr_2;
		StrStream >> parametr_3;
		StrStream >> parametr_4;
		StrStream >> parametr_5;

		if (parametr_2 == "--pomoc"){

			if (parametr_1=="pwd")
				cout << "Wyswietla aktualna sciezke "<<endl;

			if (parametr_1=="ls")
				cout << "Wyswietla listing biezacego katalogu "<< endl;

			if (parametr_1=="pomoc")
				cout << "Wyswietla liste mozliwych komend " <<endl;

			if (parametr_1=="cd")
				cout << "cd <sciezka> -zmienia katalog roboczy. cd -zmienia na domowy."
						" cd / -zmienia na glowny. cd .. -cofa "<< endl;

			if (parametr_1=="kopiuj")
				cout << " kopiuj <plik zrodlowy> <plik docelowy> " <<
				"- Kopiuje plik zrodlowy pod nazwa zadana jako docelowy"<< endl;

			if (parametr_1=="polacz")
				cout<<"polacz <plik1> <plik2> <plik docelowy> - "<<
				"Laczy dwa pliki i zapisuje go jako plik docelowy"<< endl;

			if (parametr_1=="wypisz")
				cout <<"wypisz <plik> - Wypisuje zawartosc pliku jako tekst"<<endl;
		}

		else {
			if (parametr_1 == "pwd"){
				pwd();
				historia.push_back(polecenie);
			}
			if (parametr_1 == "rysuj_trojkat"){
				rysuj_trojkat();
				historia.push_back(polecenie);
			}
			if (parametr_1 == "cd"){
				cd(parametr_2);
				historia.push_back(polecenie);
			}
			if (parametr_1 == "ls"){
				ls();
				historia.push_back(polecenie);
			}
			if (parametr_1 == "kopiuj" && !parametr_2.empty() && !parametr_3.empty()){
				kopiuj(parametr_2,parametr_3);
				historia.push_back(polecenie);
			}
			if (parametr_1 == "pomoc"){
				pomoc();
				historia.push_back(polecenie);
			}
			if (parametr_1 == "polacz"&& !parametr_2.empty() && !parametr_3.empty()&& !parametr_4.empty()){
				polacz(parametr_2,parametr_3,parametr_4);
				historia.push_back(polecenie);
			}
			if (parametr_1 == "wypisz"){
				wypisz(parametr_2);
				historia.push_back(polecenie);
			}
			if (parametr_1 == "."){

			}

		}
	}
	return 0;
}

0

Próbuje dodać kasowanie pliku, ale nie chce mi to zadziałać

void kasuj(string file)
{
	ifstream plik1 (file.c_str(), fstream::binary);
	if (!plik1.good() )
		cout << "Plik nie istnieje lub brak dostepu" <<endl;
	else {
		remove(file.c_str());
    	cout << "Plik skasowany" <<endl;
	}
}
0

Nie, po prostu nie.

1.ls, cp itd. nie są poleceniami powłoki - są zwyczajnymi aplikacjami, które powłoka wywołuje.
2.Zastanów się, co byś zrobił, mając do implementacji na przykład sto różnych poleceń, z których każde może przyjmować po nieskończenie wiele argumentów - nadal wykorzystałbyś drabinkę ifów?

0

Rozumiem, że nie podoba Ci się sposób w jaki został napisany kod?

Jednak ja bym po prostu chciał do niego dopisać tę parę funkcji i to wszystko. Nie przeszkadza mi estetyka kodu czy inne rzeczy :)

0

Jaki ma sens pisanie kodu na odwal się zamiast porządnie, z przemyślaną architekturą?
Raz sobie pomyślisz "aaaa, tutaj się nie muszę przyłożyć", a za moment będziesz projektował drugie API w stylu Elektronicznego Nadawcy #pdk

0

Ten kod jest lekko przebudowaną wersją tego co nadesłał mój wykładowca jako jeden z przykładów na których można się wzorować, więc skoro mu nie przeszkadza jak ten kod wygląda, to mi również...

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