Untitled
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