Chciałabym nawiązać do posta, w którym pisałam o kodowaniu (jego kopia znajduje się tutaj).
Próbuję kodzić coraz więcej ( w tym przypadku na system windows) i zaczyna mi przeszkadzać już fakt konwertowania
gżegżółką po każdej poprawnej kompilacji, i kompilacja wyniku. Mogłabym dodać wersję tego programu i utworzyć
makefile ale…
Zawsze to nadprodukcja śmieci i dodatkowe dziesiątki milisekund i operacje na plikach, których możnaby uniknąć.
Jest na to sposób. A mianowicie (działa tylko przy czcionce Lucida Console, przy standardowej krzaczy:( )
wystarczy na początku wpisać linijkę system(„chcp 1250>NUL”); zaś na końcu programu , system(„chcp 852>NUL”); by
zostawić tak, jak jest defaultowo. Aaa i nie mylić NUL z NULL, tam serio nie ma błędu. Nie zapomniałam tego L. Po
prostu tak się ten pseudo plik zwie. Obecnie mój kod wygląda niestety tak
#include <iostream> #include <fstream> #include <string> #include <cstdlib> #include <cstdio> using namespace std; union kluczyk{ long long knum; char ktab[8]; }; int main(int argc, char* argv[]){ system("chcp 1250>NUL"); //------------------------przygotowanie zmiennych ----------------------------- fstream zrodlo, cel; //--------------Sprawdzenie poprawnoci iloci argumentów-------------------- if ((argc <2) || (argc > 3)){ cerr<<"\nBłąd wywołania. Spróbuj "<<argv[0]<<" --help"; system("chcp 852>NUL"); exit(1); //Błąd wywołania } //----------------Przygotowanie danych dla szyfrowania------------------------------ unsigned int licznik_klucza = 0; unsigned int licznik_pola = 0; kluczyk kej; //Tu będę przechowywać klucz, pobierany w takiej formie jaka nam pasi:) kej.knum = 0; if (!((string)argv[1]=="--help")){ //Przy helpie nie ma potrzeby podawania klucza;) cout<<"\nPodaj klucz (liczbowy, im większa tym lepiej, \nale nie większa niż 9223372036854775807): "; cin>>kej.knum; cout<<endl; } //------------Dane gotowe------------------------------------------------------------- if (argc ==2){ if ((string)argv[1]=="--help"){ cout<<"Program szyfruje plik źródłowy "; cout<<endl<<"Wywołanie: "<<argv[0]<<" <plik_zródłowy> [plik_wynikowy]"<<endl; cout<<"Plik źródłowy musi być podany i musi istnieć. \n"; cout<<"W przypadku braku podania celu, wypluwa zawartoć na ekran (ale to krzaki)\n"; cout<<"Najlepiej podawać duże liczby.\n"; system("chcp 852>NULL"); exit(0); //poprawne zakończenie funkcji przy helpie } //----------------Obsługa szyfrowania z wywalaniem na ekran-------------------- zrodlo.open(argv[1], ios::in|ios::binary); if (!zrodlo.good()){ cerr<<"\nBłąd otwarcia pliku."; system("chcp 852>NULL"); exit(2); //błąd otwarcia pliku ródłowego } //właciwe przeszyfrowanie z wypluciem na ekran char znak, wynik; unsigned int kolumna; cout<<"\nPodaj szerokoć kolumny przy wywietlaniu: "; cin>>kolumna; while (!zrodlo.eof()){ licznik_klucza = licznik_pola % 8; zrodlo.get(znak); wynik = kej.ktab[licznik_klucza] ^ znak; licznik_pola ++; if ((licznik_pola % kolumna) == 0) cout<<endl; //żeby ładniej wywietlało cout<<wynik; } //od while (!zrodlo.eof()) zrodlo.close(); system("chcp 852>NUL"); exit(0); } //od dwójki w argc //-----------------------------teraz wywalamy z pliku do pliku:) --------------------------- zrodlo.open(argv[1], ios::in|ios::binary); if (!zrodlo.good()){ cerr<<"\nBłąd otwarcia pliku."; system("chcp 852>NUL"); exit(2); //błąd otwarcia pliku ródłowego } cel.open(argv[2], ios::in); bool nadpisac = false; char a; if(cel){ cout<<"\nPlik docelowy istnieje. Nadpisać? T/N: "; cin>>a; while(1){ if (toupper(a) == 'T'){ nadpisac = true; break; } else if (toupper(a) == 'N'){ break; } else { cout<<"\nNadpisać? T/N: "; cin>>a; continue; } } } cel.close(); if ((!cel) || nadpisac ==true){ cel.open(argv[2], ios::out|ios::binary); char znak, wynik; while (!zrodlo.eof()){ licznik_klucza = licznik_pola % 8; zrodlo.get(znak); wynik = kej.ktab[licznik_klucza] ^ znak; licznik_pola ++; cel.put(wynik); } //od while (!zrodlo.eof()) zrodlo.close(); cel.close(); cout<<"\nZaszyfrowano. Wynik zapisano w "<<argv[2]<<".\n"; cout<<"Odszyfrujesz tak jak szyfrowałe, jeżeli podasz ten sam klucz."; system("chcp 852>NUL"); } else { cerr<<"Plik docelowy istnieje, a nadpisać zabroniono"; system("chcp 852>NUL"); exit(3); } return 0; } //od maina
Dlaczego niestety? Mam problem z owym ” system(„chcp 852>NUL”); ” Muszę (jak widać w kodzie) umieścić go przed
każdym exitem, i oczywiście przed returnem z maina. Tutaj ok, ale jak kod rozrośnie się jeszcze bardziej?
Przydałoby mi się coś, jak destruktor całego programu. Coś, co wykona się w momencie jego zamknięcia bez względu
na to, co go spowoduje (program się wykrzaczy, skończy się prawidłowo, ktoś go skilluje, program rzuci wyjątek,
skończy się przedwcześnie przez warunkowy exit, …, …, …). Any idea jak to wymajstrować?