Press "Enter" to skip to content

Walka z kodowaniem

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 poprawnoœci iloœci 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łaœciwe przeszyfrowanie z wypluciem na ekran
            char znak, wynik;
            unsigned int kolumna;
            cout<<"\nPodaj szerokoœć kolumny przy wyœwietlaniu: ";
            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 wyœwietlał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ć?