/*
 * =====================================================================================
 *
 *       Filename:  znaki2.c
 *    Description:  Zlicza liczbe i czestosc wystapien liter alfabetu w pliku.
 *
 * =====================================================================================
 */
#include<stdio.h>
#define LICZBA_LITER 26
#define MAX_LINE 256

/*  Zlicza litery w strumieniu p. 
 *  Tablica t[] musi byc rozmiaru 26 (tyle ile liter w alfabecie).*/
void policz_znaki(FILE *plik, int t[])
{
   int i=0, znak;
   
   while( i < LICZBA_LITER )
   {
      t[i]=0;
      i=i+1;
   }

   i=0;
   while( feof(plik) == 0 )
   {
      znak = fgetc(plik);
      if (znak != EOF) 
      {
         printf("%c", znak);
         if( znak >= 'a' && znak <= 'z' ) t[znak - 'a' ] = t[znak -'a'] +1;
         if( znak >= 'A' && znak <= 'Z' ) t[znak - 'A' ] = t[znak -'A'] +1;
      }
   }
}


/*  Funkcja umieszcza tablice zliczonych znakow  w strumieniu. 
 *  Tablica t[] musi miec 26 elementow (tyle ile liter w alfabecie).*/
void zapisz_znaki(FILE *p, int t[])
{
   int i=0, suma=0;

   while( i < LICZBA_LITER )
   {
      suma = suma + t[i];
      i = i + 1;
   }

   i=0;
   while( i < LICZBA_LITER )
   {
      fprintf(p, "%c  %d  %.2f %%\n", i+ 'A' , t[i], (t[i]*100.0)/suma );
      i=i+1;
   }
}

/*  Funkcja wczytuje napis podany w terminalu. */
char *readline(char t[], int n)
{
	int znak, i=0;
	znak=getchar();
	if(znak==EOF) return NULL;

	while(znak!=EOF  && i<n-2 && znak!='\n' )
	{
		t[i]=znak;
		znak=getchar();
		i=i+1;
	}
	if(i==n-1)
	{
		t[i]=znak;
		i=i+1;
	}
	t[i]='\0';

	return t;
}


int main()
{
   FILE *plik;
   int t[LICZBA_LITER];
   char nazwa_pliku[MAX_LINE];

   printf("Podaj nazwe pliku do odczytu:\n");
   readline(nazwa_pliku, MAX_LINE );

   plik = fopen(nazwa_pliku, "r" );
   if( plik == NULL )
   {
      printf("Wystapil blad otczytu pliku\n");
      return 1;
   }


   policz_znaki(plik, t);
   fclose( plik );
   
   zapisz_znaki(stdout, t);
   
   printf("Podaj nazwe pliku do zapisu:\n");
   readline(nazwa_pliku, MAX_LINE );
   
   plik = fopen(nazwa_pliku, "w");
   if (plik == NULL)
   {
      printf("Blad otwarcia pliku\n");
      return 2;
   }

   zapisz_znaki(plik, t);
   
   fclose(plik);
   printf("Wynik zapisany do pliku %s\n", nazwa_pliku);

   return 0;
}
