Untitled
unknown
plain_text
2 years ago
3.4 kB
10
Indexable
#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);
}Editor is loading...
Leave a Comment