Witam,
ostatnio dostałem takie takie zadanie do wykonania:
"Proszę napisać program dokonujący szyfrowania/deszyfrowania zawartości pliku jednoznakowym kluczem (Program powinien być uruchamiany z poziomu procesora poleceń ).
Wymaganie 1: wykorzystanie argumentów funkcji main. Program powinien być wywołany z czterema parametrami: rodzaj operacji: s – szyfrowanie, d –deszyfrowanie, drugi - nazwa pliku do szyfrowania/deszyfrowania, trzeci - nazwa pliku zaszyfrowanego/odszyfrowanego, czwarty - jednoznakowy klucz.
Wywołanie powinno wyglądać w następujący sposób:
NazwaProgramu s plik1 plik2 X lub NazwaProgramu d plik1 plik2 X
Każde inne wywołanie powinno zostać uznane za nieprawidłowe i spowodować wyprowadzenie informacji o prawidłowym sposobie wywołania programu.
Program ma działać w pewien specyficzny sposób:
Wymaganie 2 i 3 (dynamiczna alokacja pamięci oraz blokowy i znakowy odczyt i zapis pliku): Jeżeli tylko się to uda, program powinien najpierw załadować zawartość pliku do dynamicznie zaalokowanej tablicy znaków. Potem dokonać operacji szyfrowania/deszyfrowania znaków zapisanych w tablicy i zapis wyników do pliku wynikowego. Może się jednak zdarzyć, że plik będzie tak duży, że nie uda się zaalokować tablicy równiej rozmiarowi pliku. Wtedy program powinien wykonać operację szyfrowania/deszyfrowania odczytując zawartości pliku znak po znaku. Wymaganie 4: Proszę ładnie podzielić program na funkcje, zadbać o czytelność kodu."
Niestety profesor nie zrealizował tego tematu na wykładzie, a dał jedynie materiały do samodzielnej nauki. Bazując na tych materiałach napisałem taki kod:
#include <stdio.h>
#include <string.h>
char err_mess[] = "\nBlad wywolania programu\n"
"\nparametry: [s|d] nazwa_pliku_z_danymi nazwapliku_wynikowego jednoznakowy_klucz\nWszystkie parametry sa obowiazkowe"
"\n";
long int ilosc_znakowPliku(FILE * file) //Funkcja zliczajaca znaki w pliku
{
long int counter = 0;
while( ! feof( file ) )
{
putchar( fgetc( file ) );
counter++;
}
return counter;
}
void szyfrowanie( FILE * file, FILE * file2, long int dl, char k ) // Funkcja szyfrujaca
{
char * buffer = new char [dl];
if( dl == ilosc_znakowPliku(file) /* ?? */ ) //Jesli uda sie zmiescic zawartosc calego pliku w tablicy
{
while( fgets( buffer, dl, file ) != NULL )
{
for(int i = 0; buffer[i] != '\0'; ++i)
{
buffer[i] = buffer[i] ^ k;
}
fputs(buffer, file2);
printf( "Napis po wykonaniu zadanej operacji: %s", buffer );
}
}
else //Jesli nie uda sie zmiescic calego pliku w tablicy
{
char znak;
while( fgetc( file ) != NULL )
{
znak = fgetc(file);
znak = pow(znak, k);
fputc(znak, file2);
}
}
delete [] buffer;
}
int main(int argc, char *args[] )
{
char file_name[ 256 ]; /* Zapamietuje nazwe pierwszego pliku */
char file_name2[ 256 ]; /* Zapamietuje nazwe drugiego pliku */
FILE * file; /* Wskaznik pliku pierwszego */
FILE * file2; /* Wskaznik pliku drugiego */
if( argc != 5 || args[1][1] != '\0' || args[4][1] != '\0') //Sprawdzam poprawnosc paramterow
{
printf( err_mess );
return EXIT_FAILURE;
}
else //Jesli sa poprawne to zapisuje nazwe plikow do zmiennych
{
strcpy( file_name, args[ 2 ] );
strcpy( file_name2, args[ 3 ] );
}
if( ( file = fopen( file_name, "r+t")) != NULL && ( file2 = fopen( file_name2, "r+b")) != NULL) //Otwieram oba pliki
{
printf("\nNapis przed zaszyfrowaniem: "); //Wyswietlam napis przed zaszyfrowaniem i wypisuje jego dlugosc
switch( args[1][0] )
{
case 's' :
printf("%d",ilosc_znakowPliku(file));
fclose(file);
fopen ( file_name, "r+t" );
printf("\n\nNapis po zaszyfrowaniu: ");
szyfrowanie(file, file2, ilosc_znakowPliku(file), args[4][0]); //Szyfruje plik1 i zapisuje wynik do pliku2
break;
case 'd' :
printf("%d",ilosc_znakowPliku(file));
fclose(file);
fopen ( file_name, "r+t" );
szyfrowanie(file2, file, ilosc_znakowPliku(file), args[4][0]); //Szyfruje plik2 i zapisuje wynik do pliku1
break;
default:
printf( err_mess ); // W przypadku podania zlych parametrow wyswietlam blad
break;
}
fclose( file ); //Zamykam oba pliki
fclose( file2 );
puts( "\n---- Press Enter to quit ----" );
( void )getchar();
return EXIT_SUCCESS;
}
else //Jesli wczesniej nie udalo sie otworzyc pliku, wyswietlam blad i koncze dzialanie programu
{
printf( err_mess );
puts( "\n---- Press Enter to quit ----" );
( void )getchar();
return EXIT_FAILURE;
}
}
Niestety z racji tego, że dosyć kiepsko idzie mi nauka z samej teorii, program nie działa tak jak bym chciał. Kiedy go uruchamiam z wiersza poleceń, dzieje się takie coś:
Samo wyświetlenie napisu z pliku działa poprawnie, ilość znaków obok również, ale niestety nic poza tym nie jest takie jak powinno.
Póki co, jedyne co może być błędem i przychodzi mi do głowy, to pierwszy warunek w funkcji szyfrowanie (tam gdzie znaki zapytania w kodzie), bo jeśli się nie mylę to chyba zawsze będzie on spełniony w takiej postaci, a miało to mieć za zadanie sprawdzać, czy cała zawartość pliku zmieściła się do tablicy. Nie wiem niestety co jeszcze zrobiłem źle skoro nie działa.
W związku z tym chciałbym prosić o pomoc kogoś bardziej rozeznanego, żeby spojrzał na ten kod i wskazał co zrobiłem źle, ewentualnie podpowiadając jeszcze co powinienem zrobić, żeby to poprawić.
Dziękuję z góry za wszelką pomoc, pozdrawiam.