[C++] Wyznaczanie częstotliwości znaków

Transatlantyk
Użytkownik
Użytkownik
Posty: 52
Rejestracja: 30 cze 2014, o 15:08
Płeć: Kobieta
Lokalizacja: Ziemia

[C++] Wyznaczanie częstotliwości znaków

Post autor: Transatlantyk »

no a co Ty na to?

Kod: Zaznacz cały

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <windows.h>

using namespace std;

/*skrót działania:
funkcja odczytująca pliki odczytu i zapisu
funkcja sprawdzająca poprawność wczytanych plików i zwracająca iformację
funkacja licząca dwuznaki w danym pliku
funkcja zapisaująca dane do pliku końcow

void  check(string &wejscie)
{
   fstream plik;
   plik.open(wejscie, ios::out);
   if (plik.good() == true) { plik.close(); return 1;}
      else {
            cout << "Plik odczytu nie istnieje" << endl;
            plik.flush();
            plik.close();
            exit(1);
             }
}

void search(const string &wyjscie, string &wejscie)
{
   long dw=0, t=0, y=0, pozycja=0;
   string dane;
   fstream plik;
   plik.open(wejscie, ios::out);
   pozycja = plik.tellp();
   int z=(y%12);
   int u=(y-z);
                                                            
   char** textline = new char*[y];
   char tab1[12] = { 'c','d','g','l','n','p','q','r','s','t','x','z' };
   char tab2[10][4] =
   {
      { 'h', 'k', 's', 'z' },{ 'z', 'ż', 'ź', },
      { 'h', 'l', 'n' },{ 'y' },
      {'g', 'y'},{'h'},{'u'},{'z'},
      {'c', 'h', 'z'},{'h', 's'}
   };
   char tab1[12] = { 'c','d','g','l','n','p','q','r','s','t','x','z' };

  do{
   plik.seekg(y, ios::cur);
   y=(y+t);
   getline(plik, dane);
   y = dane.length();
   for (int n = 1; n < y; n++)
   {
      for (int j = 0; j < 12; j++)
      {
         if (*textline[n] == tab1[j])
         {
            for (int i = 0; i < 4; i++)
            {
               if (*textline[n - 1] == tab2[j][i])
               {
                  dw++;
               }
            }
         }
      }
    z=z-1;
   }
 }while( z==0 && pozycja != ios::end);
if(u!=)
{
  y=y+u;
   for (int n = 0; n <u ; n++)
   {
      for (int j = 0; j < 12; j++)
      {
         if (*textline[n] == tab1[j])
         {
            for (int i = 0; i < 4; i++)
            {
               if (*textline[n - 1] == tab2[j][i])
               {
                  dw++;
               }
            }
         }
      }
   }
 }
   plik.flush();
   plik.close();
   plik.open(wyjscie, ios::in);
   wyjscie<<"Tekst posiada "<<dw<<" dwuznaków, natomiast "<<y<<"znaków";
   plik.flush();
   plik.close();
}



int main(int argc, char *argv[])
{
   if (argc != 5) {
      cout << "zla ilosc podanych argumentow"; return(1);
   }
   argv[2]=const string wyjscie;
   argv[3]= string wejscie;
   check(wyjscie, wejscie);
   search(wejscie, wyjscie);
}
-- 28 lis 2016, o 18:27 --

doczytałam teraz jeszcze dwa wymogi co po programu

1. Program musi być odporny na błędy wprowadzanych danych (brak plików, błędne dane, błędny
format danych, puste pliki, niepoprawne parametry uruchomienia programu, . . . ). Błąd danych nie
może spowodować zatrzymania programu przez system operacyjny. Program powinien wyświetlić
stosowny komunikat.
2. Program musi dopuszczać niewielkie niezgodności formatu danych wejściowych (puste linie, dodatkowe
spacje, białe znaki, . . . )

jak się do tego wgl zabrać????
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Wyznaczanie częstotliwości znaków

Post autor: kalwi »

Kod: Zaznacz cały

 argv[2]=const string wyjscie;
   argv[3]= string wejscie;
źle

w mainie

Kod: Zaznacz cały

 return(1);
Lepiej zastosować exit(), no, ale powiedzmy, że jest ok

Kod: Zaznacz cały

   check(wyjscie, wejscie);
   search(wejscie, wyjscie);
main jest typu int (no, właściwie to nie jest, ale mniejsza), także na koniec -

Kod: Zaznacz cały

return 0

Kod: Zaznacz cały

void  check(string &wejscie)
albo

Kod: Zaznacz cały

void  check(const string &wejscie)
albo

Kod: Zaznacz cały

void  check(string wejscie)
przy czym to drugie jest bardziej zalecane


w check

Kod: Zaznacz cały

 return 1;
Po co? Przecież to jest funkcja typu void

Kod: Zaznacz cały

            plik.flush();
To nie działa tak, jak myślisz

Kod: Zaznacz cały

            exit(1);
Po to są aliasy EXIT_FAILURE i EXIT_SUCCESS aby ich używać, bo się kod wtedy czytelniejszy staje. Czyli

Kod: Zaznacz cały

            exit(EXIT_FAILURE);

linijki 20-26 - formatowanie do poprawy

Kod: Zaznacz cały

void search(const string &wyjscie, string &wejscie)
to co wyżej -> dodaj const albo usuń referencje (lepiej to drugie)

Kod: Zaznacz cały

   pozycja = plik.tellp();
ta linijka jest niepotrzebna, po otwarciu zawsze będzie na początku pliku kursor ustawiony
a potem

Kod: Zaznacz cały

   int z=(y%12);
bez sensu

Kod: Zaznacz cały

   int u=(y-z);
co jest równoważne

Kod: Zaznacz cały

int u = 0;

Kod: Zaznacz cały

   char tab1[12] = { 'c','d','g','l','n','p','q','r','s','t','x','z' };
można napisać

Kod: Zaznacz cały

char tab1[] = { 'c','d','g','l','n','p','q','r','s','t','x','z' };
kompilator sam sobie zliczy..

Kod: Zaznacz cały

   char tab1[12] = { 'c','d','g','l','n','p','q','r','s','t','x','z' };
i po co to jest drugi raz

Kod: Zaznacz cały

   char tab2[10][4] =
   {
      { 'h', 'k', 's', 'z' },{ 'z', 'ż', 'ź', },
      { 'h', 'l', 'n' },{ 'y' },
      {'g', 'y'},{'h'},{'u'},{'z'},
      {'c', 'h', 'z'},{'h', 's'}
   };
w C++ się nie stosuje polskich znaków diakrytycznych, co zresztą masz napisane w treści zadania

Napisz może dokładnie, co ten program ma robić - bo patrząc na treść, to on ma wczytać tekst z jakiegoś pliku, zliczyć występowanie każdego znaku oraz zliczyć ilość występowania dwuznaków.

A patrząc na Twój kod, to kompletnie co innego się robi (w sumie ciężko nawet mi powiedzieć co, bo ten kod nie ma żadnego sensu)

1. Program musi być odporny na błędy wprowadzanych danych (brak plików, błędne dane, błędny
format danych, puste pliki, niepoprawne parametry uruchomienia programu, . . . ). Błąd danych nie
może spowodować zatrzymania programu przez system operacyjny. Program powinien wyświetlić
stosowny komunikat.
2. Program musi dopuszczać niewielkie niezgodności formatu danych wejściowych (puste linie, dodatkowe
spacje, białe znaki, . . . )
brak plików
no to już to masz (chyba, że plik wyjściowy również ma istnieć, ale dla mnie to akurat bez sensu warunek)
błędne dane
jakie niby błędne dane? jedyne błędne dane jakie może mieć plik wejściowy, to znaki diakrytyczne, ale to jest taka zabawa już trochę
błędnyformat danych
jak wyżej
niepoprawne parametry uruchomienia programu
no to sprawdzasz, czy argument pierwszy to -o, trzeci to -i, a dwa pozostałe są różne od znaku końca stringa

Albo się dopytaj, albo wklej całą treść polecenia, bo pewnie tam to jest napisane...
Transatlantyk
Użytkownik
Użytkownik
Posty: 52
Rejestracja: 30 cze 2014, o 15:08
Płeć: Kobieta
Lokalizacja: Ziemia

[C++] Wyznaczanie częstotliwości znaków

Post autor: Transatlantyk »

to od początku:

zasady zaliczenia:

1. Program musi być napisany w języku C++.
2. Program jest uruchamiany z linii poleceń.
3. Parametry przekazywane są do programu z linii poleceń.
4. Parametry mogą być podawane w dowolnej kolejności.
5. Po uruchomieniu program nie oczekuje na akcje użytkownika, po wykonaniu operacji kończy się.
6. Program musi być odporny na błędy wprowadzanych danych(brak plików, błędne dane, błędny
format danych, puste pliki, niepoprawne parametry uruchomienia programu, . . .).Błąd danych nie może spowodować zatrzymania programu przez system operacyjny.Program powinien wyświetlić
stosowny komunikat.
7. Program musi dopuszczać niewielkie niezgodności formatu danych wejściowych(puste linie, dodatkowe spacje, białe znaki, . . .).
8. Programy powinny mieć opcję wypisywania krótkiej pomocy po uruchomieniu z przełącznikiem
- h, np.program - h.Ta sama pomoc powinna zostać wydrukowana po uruchomieniu programu
z nieprawidłowymi parametrami lub bez parametrów.
9. Kod programu powinien być sformatowany i zawierać komentarze opisujące działanie poszczególnych funkcji, jak również opis znaczenia wszystkich zmiennych.
10. Program powinien być napisany optymalnie pod względem czasu wykonania i zajętości pamięci.


natomiast to jest t ojest cała treść mojego zadania:

Napisać plik do wyznaczania częstotliwości występowania znaków i dwuznaków w pliku o podanej
nazwie. Plik jest zapisany alfabetem łacińskim (bez znaków diakrytyzowanych). Program wczytuje nazwę pliku z linii poleceń (po przełączniku -i) i zapisuje wynik do pliku, którego nazwa jest podana po przełączniku -o. Przykładowe wywołanie programu: program.exe -o wyjscie -i wejscie

to mój kod, w kolejności, z komentarzami:

Kod: Zaznacz cały

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <windows.h>

using namespace std;
ta funkcja ma pobrać nazwę pilku wejśćiowego pobranego wcześniej
z lini poleceń(która nie wiem czym tak dokładnie jest), sprawdzić, czy dany plik istnieje,
jeżeli plik nie istnieje zamyka program (gdzie tu odporność na błędy?)

Kod: Zaznacz cały

void  check(string wejscie)
{
fstream plik;
plik.open(wejscie, ios::out);
if (plik.good() == true) { plik.close(); }
else {
cout << "Plik odczytu nie istnieje" << endl;
plik.close();
exit(EXIT_FAILURE);
}
}

funkcja ma odczytać plik po linijce, zliczać jednocześnie dwuznaki
i znaki oraz pod koniec wpisać wynik końcowy do pliku wykściowego.
na początku inicjuje zmienne.potem tworzę trzy tablice, opiszę to jako komentarz

Kod: Zaznacz cały

void search(const string wyjscie, string wejscie)
{
	long double dw = 0, t = 0, y = 0;
	string dane;
	fstream plik;
	plik.open(wejscie, ios::out);

//char** jest tablicą dynamiczną, będą w niej zapisywane kolejne linijki tekstu 

	char** textline = new char*[y];
	
//dwie poniższe tablice służą do wykrywania dwuznaków- tab 1 sprawdza, czy dana litera
//pobrana z pliku tekstowego w pętli może być pierwszą literą dwuznaku, druga, analogicznie   
//sprawdza czy pobrana litera może być drugą literą dwuznaku i czy rzeczywiście twrzy z pierwszą //dwuznak

	char tab1[] = { 'c','d','g','l','n','p','q','r','s','t','x','z' };
	char tab2[][4] =
	{
	{ 'h', 'k', 's', 'z' },{ 'z', 'ż', 'ź', },
	{ 'h', 'l', 'n' },{ 'y' },
	{'g', 'y'},{'h'},{'u'},{'z'},
	{'c', 'h', 'z'},{'h', 's'}
	};


	do {
		plik.seekg(y, ios::cur);        
 //ustawiam kursor na bierzącej pozycji
		y = (y + t);
//kursor przy okazji wykorzystuję do zliczania znaków w pliku(czy też białych?)
		getline(plik, dane);
		y = dane.length();
		for (int n = 1; n < y; n++)
//dopóki nie preskanujemy całej linijki sprawdzamy zgodność znaków
		{
			for (int j = 0; j < 12; j++)
			{
				if (*textline[n] == tab1[j])
				{
					for (int i = 0; i < 4; i++)
					{
						if (*textline[n - 1] == tab2[j][i])
//tu mamy już informację, czy znaleźliśmy dwuznak
						{
							dw++;
						}
					}
				}
			}
		}
	}
	(while fstream.seekp(y != ios::end)
//funkcja wykonuje się dopóki nie odczytamy całego pliku
		plik.close();
	plik.open(wyjscie, ios::in);
//zapis do pliku wyjsciowego wyniku 
	wyjscie << "Tekst posiada " << dw << " dwuznaków, natomiast " << y << "znaków";
	plik.close();
}
no i funkcja main

Kod: Zaznacz cały

int main(int argc, char *argv[])
{
	if (argc != 5) {
		cout << "zla ilosc podanych argumentow"; exit(EXIT_FAILURE);
	}
//TUTAJ NIE WIEM JAK ZAPISAĆ TE ARGV czy mam zastosować funkcję if
//sprawdzającą, czy podane argv są poprawne? czy mam je jakoś zainicjować?
	argv[0] == ? ? ? ? ;
	argv[1] == -o;
	argv[2] == wyjscie;
	argv[3] == -i;
	argv[4] == wejscie;
	check(wejscie);
	search(wejscie, wyjscie);
	return 0;
}


ok, jestem bardzo początkująca, poszłam na studia nie wiedząc nic o komputerach ale mająć umysł ścisły. okropnie mnie to zajarało, ale jak można się domyśleć, nie wiem nic. bardzo bardzo chcę się nauczyć programować, wybacz głupoty które wypisuję. gdybyś mógł odpalić tow swoim środkowisku i zobaczyć jakie błędy wyskakują, nie mam pojęcia jak je przeskoczyć
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Wyznaczanie częstotliwości znaków

Post autor: kalwi »

ta funkcja ma pobrać nazwę pilku wejśćiowego pobranego wcześniej
Nie robi tego, zresztą ta nazwa przed wywołaniem tej funkcji jest już przypisana
z lini poleceń(która nie wiem czym tak dokładnie jest),
Poszukaj w google, zresztą wcześniej już wysyłałem linki z tłumaczeniem co to jest
sprawdzić, czy dany plik istnieje
nie sprawdza
char** jest tablicą dynamiczną
raczej "dynamiczną tablicą tablic"

Kod: Zaznacz cały

   char** textline = new char*[y];
i y=0, nie zaalokowałaś ani bajta pamięci
ok, jestem bardzo początkująca, poszłam na studia nie wiedząc nic o komputerach ale mająć umysł ścisły
No i świetnie, 90% ludzi u mnie na kierunku (EITI PW) nie programowało przed przyjściem na studia
jak można się domyśleć, nie wiem nic
to trzeba otworzyć książkę / wykład / tutorial na yt i się nauczyć, a nie brnąć na ślepo.
Jest już połowa semestru akademickiego, a Ty nadal nie rozumiesz totalnych podstaw języka.

-- 1 gru 2016, o 02:48 --

Co do tego kodu - nawet nie chce mi się go komentować, bo dostajesz ode mnie gotowy kod na tacy i w następnym poście nadal jest to źle.
Ten program tak powinien być napisany (oprócz dwuznaku, nie chce mi się teraz nad tym myśleć)

Kod: Zaznacz cały

#include <iostream>
#include <fstream>
#include <vector>
#include <cstdio>
// zamiast cout << "POMOC" << endl; powinna wywowylwac sie odpowiednia funkcja

using namespace std;

void checkArguments(int argc, const char* argv[]);
void checkFile(string input);
void setIONames(const char *argv[], string &input, string &output);
void searchChar(string input, string output);
void searchDigraph(string input, string output);

int main(int argc, const char* argv[])
{
	checkArguments(argc, argv);
	string input, output;
	setIONames(argv, input, output);
	checkFile(input);
	searchChar(input, output);
	searchDigraph(input, output);
	return 0;
}

void checkArguments(int argc, const char* argv[])
{ // mozna to zrobic bardziej elegancko
	if(argc != 5)
	{
		cout << "Zla liczba argumentow" << endl;
		cout << "POMOC" << endl;
		exit(EXIT_FAILURE);
	}
	if(string(argv[1]) != "-i" and string(argv[3]) != "-i")
	{
		cout << "Zla kolejnosc arugmentow lub zle argumenty" << endl;
		cout << "POMOC" << endl;
		exit(EXIT_FAILURE);
	}
		if(string(argv[1]) != "-o" and string(argv[3]) != "-o")
	{
		cout << "Zla kolejnosc arugmentow lub zle argumenty" << endl;
		cout << "POMOC" << endl;
		exit(EXIT_FAILURE);
	}
}

void setIONames(const char *argv[], string &input, string &output)
{
	if(string(argv[1]) == "-i")
	{
		input = string(argv[2]);
		output = string(argv[4]);
	}
	else // argv[1] == "-o"
	{
		input = string(argv[4]);
		output = string(argv[2]);
	}
}

void checkFile(string input)
{
	if(!ifstream(input))	
	{
		cout << "Plik wejsciowy nie istnieje!" << endl;
		cout << "POMOC" << endl;
		exit(EXIT_FAILURE);
	}
	ifstream file;
	file.open(input);

	if(file.good() != true)
	{
		cout << "Nie ma dostepu do pliku wejsciowego!" << endl;
		cout << "POMOC" << endl;
		exit(EXIT_FAILURE);
	}

	file.seekg(0, file.end);
	if(!file.tellg())
	{
		cout << "Plik wejsciowy jest pusty!" << endl;
		cout << "POMOC" << endl;
		exit(EXIT_FAILURE);
	}
	file.close();
}

void searchChar(string input, string output) // wyszukuje a-z, A-Z
{
	ifstream file_i(input);
	if(file_i.good() != true)
	{
		cout << "Nie moge otworzyc pliku wejsciowego!" << endl;
		exit(EXIT_FAILURE);
	}
	ofstream file_o(output);
	if(file_o.good() != true)
	{
		cout << "Nie moge utworzyc pliku wyjsciowego!" << endl;
		exit(EXIT_FAILURE);
	}
	
	vector <size_t>array('z' - 'a');
	char c, temp;
	for(int i = 0, temp = 'a'; temp <= 'z'; ++temp, ++i)
	{	
		file_i.clear();
		file_i.seekg(0, ios::beg);
		while(file_i.get(c))
		{
			if(c == temp)
				++array[i];
		}
		if(array[i])
			file_o << "Znak \"" << char(temp) << "\" wystapil " << array[i] << " raz(y);" << endl;
	}

	fill(array.begin(), array.end(), 0);

	for(int i = 0, temp = 'A'; temp <= 'Z'; ++temp, ++i)
	{	
		file_i.clear();
		file_i.seekg(0, ios::beg);
		while(file_i.get(c))
		{
			if(c == temp)
				++array[i];
		}
		if(array[i])
			file_o << "Znak \"" << char(temp) << "\" wystapil " << array[i] << " raz(y);" << endl;
	}
	file_i.close();
	file_o.close();
}

void searchDigraph(string input, string output)
{
	ifstream file_i(input, ios::app);
	if(file_i.good() != true)
	{
		cout << "Nie moge otworzyc pliku wejsciowego!" << endl;
		exit(EXIT_FAILURE);
	}
	ofstream file_o(output, ios::app);
	if(file_o.good() != true)
	{
		cout << "Nie moge utworzyc pliku wyjsciowego!" << endl;
		exit(EXIT_FAILURE);
	}

	vector<string> tab = {"SZ", "RZ", "CZ", "CI", "NI", "SI", "ZI", "CH"};
	size_t length = file_i.tellg();
	file_i.seekg(0);
	vector<size_t> array(tab.size());

	for(size_t i = 0; i < tab.size(); ++i)
	{
		// jakis kod
		if(array[i])
			file_o << "Dwuznak \"" << tab[i] << "\" wystapil " << array[i] << " raz(y);" << endl;	
	}

}
I tak to wygląda przy uruchamianiu:


-- 1 gru 2016, o 12:39 --

A nawet dokończyłem ten kod:

Kod: Zaznacz cały

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

void checkArguments(int argc, const char* argv[]);
void checkFile(string input);
void setIONames(const char *argv[], string &input, string &output);
void searchChar(string input, string output);
void searchDigraph(string input, string output);
void help(void);

int main(int argc, const char* argv[])
{
	checkArguments(argc, argv);
	string input, output;
	setIONames(argv, input, output);
	checkFile(input);
	searchChar(input, output);
	searchDigraph(input, output);
	return 0;
}

void checkArguments(int argc, const char* argv[])
{ 
	if(argc != 5)
	{
		cout << "Zla liczba argumentow" << endl;
		help();
		exit(EXIT_FAILURE);
	}
	if(string(argv[1]) != "-i" and string(argv[3]) != "-i")
	{
		cout << "Zla kolejnosc arugmentow lub zle argumenty" << endl;
		help();
		exit(EXIT_FAILURE);
	}
		if(string(argv[1]) != "-o" and string(argv[3]) != "-o")
	{
		cout << "Zla kolejnosc arugmentow lub zle argumenty" << endl;
		help();
		exit(EXIT_FAILURE);
	}
}

void setIONames(const char *argv[], string &input, string &output)
{
	if(string(argv[1]) == "-i")
	{
		input = string(argv[2]);
		output = string(argv[4]);
	}
	else // argv[1] == "-o"
	{
		input = string(argv[4]);
		output = string(argv[2]);
	}
}

void checkFile(string input)
{
	if(!ifstream(input))	
	{
		cout << "Plik wejsciowy nie istnieje!" << endl;
		help();
		exit(EXIT_FAILURE);
	}
	ifstream file;
	file.open(input);

	if(file.good() != true)
	{
		cout << "Nie ma dostepu do pliku wejsciowego!" << endl;
		help();
		exit(EXIT_FAILURE);
	}

	file.seekg(0, file.end);
	if(!file.tellg())
	{
		cout << "Plik wejsciowy jest pusty!" << endl;
		help();
		exit(EXIT_FAILURE);
	}
	file.close();
}

void searchChar(string input, string output) // wyszukuje a-z, A-Z
{
	ifstream file_i(input);
	if(file_i.good() != true)
	{
		cout << "Nie moge otworzyc pliku wejsciowego!" << endl;
		help();
		exit(EXIT_FAILURE);
	}
	ofstream file_o(output);
	if(file_o.good() != true)
	{
		cout << "Nie moge utworzyc pliku wyjsciowego!" << endl;
		help();
		exit(EXIT_FAILURE);
	}
	
	vector <size_t>array('z' - 'a');
	char c, temp;
	for(int i = 0, temp = 'a'; temp <= 'z'; ++temp, ++i)
	{	
		file_i.clear();
		file_i.seekg(0, ios::beg);
		while(file_i.get(c))
		{
			if(c == temp)
				++array[i];
		}
		if(array[i])
			file_o << "Znak \"" << char(temp) << "\" wystapil " << array[i] << " raz(y);" << endl;
	}

	fill(array.begin(), array.end(), 0);

	for(int i = 0, temp = 'A'; temp <= 'Z'; ++temp, ++i)
	{	
		file_i.clear();
		file_i.seekg(0, ios::beg);
		while(file_i.get(c))
		{
			if(c == temp)
				++array[i];
		}
		if(array[i])
			file_o << "Znak \"" << char(temp) << "\" wystapil " << array[i] << " raz(y);" << endl;
	}
	file_i.close();
	file_o.close();
}

void searchDigraph(string input, string output)
{
	ifstream file_i(input, ios::app);
	if(file_i.good() != true)
	{
		cout << "Nie moge otworzyc pliku wejsciowego!" << endl;
		help();
		exit(EXIT_FAILURE);
	}
	ofstream file_o(output, ios::app);
	if(file_o.good() != true)
	{
		cout << "Nie moge utworzyc pliku wyjsciowego!" << endl;
		help();
		exit(EXIT_FAILURE);
	}

	vector<string> tab = {"SZ", "RZ", "CZ", "CI", "NI", "SI", "ZI", "CH",
						  "sz", "rz", "cz", "ci", "ni", "si", "zi", "ch",
						  "sZ", "rZ", "cZ", "cI", "nI", "sI", "zI", "cH",
						  "Sz", "Rz", "Cz", "Ci", "Ni", "Si", "Zi", "Ch"};
	vector<size_t> array(tab.size());
	string word;
	size_t found;

	for(size_t i = 0; i < tab.size(); ++i)
	{
		file_i.clear();
		file_i.seekg(0, ios::beg);
		while(file_i >> word)
		{
			found = word.find(tab[i]);
			while(found != string::npos)
			{
				++array[i];
				found = word.find(tab[i], found + 1);
			}
		}
		if(array[i])
			file_o << "Dwuznak \"" << tab[i] << "\" wystapil " << array[i] << " raz(y);" << endl;	
	}
	file_i.close();
	file_o.close();
}

void help(void)
{
	cout << "Tutaj sie wyswietla informacja jak uzywac programu" << endl;
}
wynik:
ODPOWIEDZ