Mam problem z programem deszyfrującym. program już robi statystykę znaków w tekście oraz jest w nim umieszczona statystyka standardowa wysatepowania znakow w języku angielskim. Problem sprawia mi natomiast ta część kodu, w której dochodzi do zamiany liter w oryginalnym pliku na ich odpowiedniki wzięte ze statystyki (tablica Tab[i]) oraz zapis do pliku wyjściowego - zapis nie dziala, tj. zapisuje tylko najczęstszy znak w pliku, poprawnie odszyforwany.przypuszczam że to jakiś problem z pętlami, a może i nie tylko. Bardzo prosze o pomoc w rozwiązaniu tego problemu.
#include <stdio.h>
#include <stdlib.h>
int freq(const void *arg1, const void *arg2); //deklaracja funckji
//poronujacej czestosc
typedef struct char_str //struktura przechowuje
{ //informacje o odczytanym
int val; //znaku {char)z szyfrogramu
int fre; //wartosc i czestosc
} CH;
CH frequency[256]; //tablica czestosci znakow
char Tab[256];
char tt[256];
char ttt[256];
int main(int argc, char *argv[]) //glowny program
{
int counter,c,i,k,shift; //zmienne globalne
FILE *input; //pliki wej/wyj
FILE *output;
char cc;
printf("Program zlicza wystapienia kazdego znaku w podanym pliku\n");
printf("zaszyfrowanych, a nastepnie przeprowadza statystyke czestoci\n");
printf("znakow w jezyku angielskim i na jej podstawie deszyfruje szyfrogram\n");
if (argc < 2) //jezeli nie podano nazwy pliku wej.,
{ //komunikat o uruchamianiu programu
printf("Prosze wpisac: ./a.out <nazwa pliku z tekstem szyfrowanym>\n");
while (getchar() != '\n');
exit(0); //wyjscie z programu
}
input = fopen(argv[1], "r"); //oznacza iz podano nazwe
if (input == NULL) //jako argument linii polecen
{
printf("Brak pliku %s ! \n", argv[1]); //jezeli brak pliku-wyjscie
exit(EXIT_FAILURE);
}
for (i=0;i<256;i++) //plik wej. pomyslnie otwarty
frequency[i].val=i; //do odczytu
c=fgetc(input);
while (c!=EOF) //liczenie znakow
{
counter++;
if (c>=' ') //zwiekszamy czestosc danego
frequency[c].fre++; //znaku, gdy jest on > 32
c=fgetc(input); //spacja
}
fclose(input); //zamkniecie pliku
qsort(frequency, 256, sizeof(CH), freq); //wykorzystanie funckji qsort
for (counter=0,k=0;counter<256;counter++) //z biblioteki <stdlib.h>
{ //(sortowanie tabeli czestoci
if (frequency[counter].fre != 0) //dla czestosci roznych od 0
{ //mozna wypisac statstyke
printf("%3c = %d\n",frequency[counter].val,frequency[counter].fre);
//Tab[counter]=frequency[counter].val;
tt[counter]=frequency[counter].val;
}
}
printf("%3c \n",Tab[0]);
Tab[0]=' ';
Tab[1]='e';
Tab[2]='a';
Tab[3]='r';
Tab[4]='i';
Tab[5]='o';
Tab[6]='t';
Tab[7]='n';
Tab[8]='s';
Tab[9]='l';
Tab[10]='c';
Tab[11]='u';
Tab[12]='d';
Tab[13]='p';
Tab[14]='m';
Tab[15]='h';
Tab[16]='g';
Tab[17]='b';
Tab[18]='f';
Tab[19]='y';
Tab[20]='w';
Tab[21]='k';
Tab[22]='v';
Tab[23]='x';
Tab[24]='z';
Tab[25]='j';
Tab[26]='q';
//wypisanie najczestszego znaku i ilosci jego wystapien
//printf("najczestszym znakiem jest: %3c",frequency[1].val);
output = fopen("text.dat", "w"); //otwarcie pliku wyjsciowego
input = fopen(argv[1], "r"); //i ponownie wejsciowego
for (i=1;i<100;i++)
{
tt[i] = fgetc(input);
while ((tt[i]=getc(input))!=EOF)
{
//printf("%c",tt[i]);
if (tt[i]=frequency[counter].val);
{
tt[i]=Tab[i];
printf("%c ",tt[i]);}
putc(tt[i],output);
}
}
fclose(input);
fclose(output);
printf("\nzakonczono deszyfrowanie, klawisz 'ENTER' zakonczy program");
while (getchar() != '\n');
return(0);
}
//funkcja porownujaca czestosc wystepowanie znakow, uzywana przez
//funckcje qsort sertujaca tabele czestosci znakow w tekscie:
int freq(const void *arg1, const void *arg2)
{
CH *Arg1 = (CH *)arg1;
CH *Arg2 = (CH *)arg2;
return (Arg2->fre - Arg1->fre);
}