Untitled

mail@pastecode.io avatar
unknown
plain_text
7 months ago
3.4 kB
3
Indexable
Never
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <windows.h>

using namespace std;

void tworzeniePlikow(string nazwaPliku, int slowa, int szerokosc, int dlugosc) {
	ofstream plik(nazwaPliku);

	int aktSzer = 0;
	int minDlSlowa = 2;
	string linia = "";

	if (plik.is_open()) {
		for (int i = 0; i < slowa; i++) {
			int dlSlowa = minDlSlowa + rand() % (dlugosc - minDlSlowa + 1);
			aktSzer += dlSlowa;
			for (int j = 0; j < dlSlowa; j++) {
				linia += 'a' + (rand() % 26);
			}
			if (aktSzer > szerokosc) {
				linia += "\n";
				aktSzer = 0;
			}
			else {
				linia += " ";
			}
			plik << linia;
			linia = "";
		}
	}

	plik.close();

}

void stworzWatek(vector<string> nazwyPlikow, int ilePlikow) {
	vector<PROCESS_INFORMATION> procesInfo(ilePlikow);
	vector<HANDLE> procHandles(ilePlikow);
	SECURITY_ATTRIBUTES saAttr;
	saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
	saAttr.bInheritHandle = TRUE;
	saAttr.lpSecurityDescriptor = NULL;

	for (int i = 0; i < ilePlikow; i++) {
		string polecenieCMD = "ProgramPodrzedny.exe " + nazwyPlikow.at(i);
		wstring sformatowanePolecenie(polecenieCMD.begin(), polecenieCMD.end());

		HANDLE hReadPipe, hWritePipe;
		if (!CreatePipe(&hReadPipe, &hWritePipe, &saAttr, 0)) {
			cerr << "Błąd podczas tworzenia potoku dla pliku " << nazwyPlikow.at(i) << endl;
			continue;
		}

		STARTUPINFO startupInfo;
		memset(&startupInfo, 0, sizeof(startupInfo));
		startupInfo.cb = sizeof(startupInfo);
		startupInfo.hStdOutput = hWritePipe;
		startupInfo.dwFlags |= STARTF_USESTDHANDLES;

		if (!CreateProcess(NULL, (LPWSTR)sformatowanePolecenie.c_str(), NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &startupInfo, &procesInfo[i])) {
			cerr << "Błąd podczas tworzenia procesu dla pliku " << nazwyPlikow.at(i) << endl;
			CloseHandle(hReadPipe);
			CloseHandle(hWritePipe);
			continue;
		}

		CloseHandle(hWritePipe);
		procHandles[i] = hReadPipe;
	}

	DWORD dwRead;
	CHAR chBuf[4096];
	for (int i = 0; i < ilePlikow; i++) {
		if (procHandles[i] == NULL)
			continue;

		while (true) {
			if (!ReadFile(procHandles[i], chBuf, sizeof(chBuf), &dwRead, NULL) || dwRead == 0)
				break;
			cout.write(chBuf, dwRead);
		}

		CloseHandle(procHandles[i]);
	}

	WaitForMultipleObjects(ilePlikow, procHandles.data(), TRUE, INFINITE);
}

int main() {
	int ilePlikow;
	do {
		cout << "Podaj liczbe plikow (max 20): ";
		cin >> ilePlikow;
	} while (ilePlikow <= 0 || ilePlikow > 20);

	int maxSlowa;
	do {
		cout << "Podaj liczbe slow w jednym pliku (max 5000, min 10): ";
		cin >> maxSlowa;
	} while (maxSlowa < 10 || maxSlowa > 5000);

	int minSzerokosc;
	do {
		cout << "Podaj minimalna szerokosc tekstu (max 300, min 10): ";
		cin >> minSzerokosc;
	} while (minSzerokosc < 10 || minSzerokosc > 300);

	int maxDlugosc;
	do {
		cout << "Podaj maksymalna dlugosc slowa (max 80, min 3): ";
		cin >> maxDlugosc;
	} while (maxDlugosc < 3 || maxDlugosc > 80);


	vector<string>nazwyPlikow;

	srand(time(0));

	for (int i = 0; i < ilePlikow; i++) {
		string nazwa = "dane" + to_string(i) + ".txt";
		nazwyPlikow.push_back(nazwa);
		tworzeniePlikow(nazwa, maxSlowa, minSzerokosc, maxDlugosc);
	}

	stworzWatek(nazwyPlikow, ilePlikow);

}
Leave a Comment