Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <pthread.h>
- #include <string.h>
- //#define _CRT_SECURE_NO_WARNINGS
- #define POCETZNAKU 62
- #define SOUBOR "random1.dat"
- //const char* SOUBOR = "random1.dat";
- //FILE *fp;
- int pocetVlaken = 5; /// TODO argument pri spusteni programu
- char poleZnaku[POCETZNAKU] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
- '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' };
- void vytvorSoubor(int);
- int FileScan();
- void producenti(int, char*);
- void* producentFunctions(int, char);
- typedef struct Bloky{
- char *blok;
- int delkaBlok;
- }blck;
- int main(int argc, char* argv[]) {
- //pocetVlaken = argv[1];
- #pragma region vytvoreni souboru a zjisteni velikosti bloku
- vytvorSoubor(10000000);
- int velikostSouboru = FileScan();
- if (velikostSouboru/pocetVlaken > 1000)
- {
- pocetVlaken = velikostSouboru/1000; // max velikost jednoho bloku bude 1kB
- printf("!!!Nedostatecny pocet vlaken!!! \nPocet vlaken zmenen na %d\n", pocetVlaken);
- }
- int velikostBloku = velikostSouboru / pocetVlaken;
- int posledniBlok = velikostSouboru % pocetVlaken; // pricist k poslednimu vlaknu
- #pragma endregion
- FILE *file;
- file = fopen(SOUBOR, "r");
- pthread_t *producent_ta = malloc(pocetVlaken,sizeof(int));
- pthread_t consumer_t;
- int i,b;
- for (i = 0; i < pocetVlaken; i++){
- if (i == pocetVlaken-1) //posledni vlakno
- {
- #pragma region posledni blok textu
- blck p;
- p.delkaBlok = velikostBloku + posledniBlok;
- p.blok = malloc(p.delkaBlok);
- for (b = 0; b < p.delkaBlok; b++)
- {
- p.blok[b] = fgetc(file);
- }
- printf("velikost POSLEDNIHO bloku %d B\n", velikostBloku + posledniBlok);
- getchar();
- ///producenti(velikostBloku + posledniBlok, p);
- // predani pole p vlaknu
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- //pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- pthread_create(&producent_ta[i], &attr, &producentFunctions, (void *)&p);
- #pragma endregion
- }
- else
- {
- #pragma region bloky od 1 do n-1
- blck p;
- p.delkaBlok = velikostBloku;
- p.blok = malloc(p.delkaBlok);
- for (b = 0; b < p.delkaBlok; b++)
- {
- p.blok[b] = fgetc(file);
- }
- printf("velikost bloku %d B\n", velikostBloku);
- getchar();
- ///producenti(velikostBloku, p);
- // predani pole p vlaknu
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- pthread_create(&producent_ta[i], &attr, &producentFunctions, (void *)&p);
- }
- #pragma endregion
- }
- fclose(file);
- for (int i = 0; i < pocetVlaken; i++)
- {
- }
- //// vlakna
- getchar();
- return EXIT_SUCCESS;
- }
- void vytvorSoubor(int velikost)
- {
- FILE *file;
- file = fopen(SOUBOR, "w");
- int i, j;
- for (i = 0; i<velikost; i++)
- {
- j = (int)rand() % POCETZNAKU;
- putc(poleZnaku[j], file); // pole Znaku = predem definovane znaky
- }
- printf("Vytvoren soubor \"%s\"\n", SOUBOR);
- fclose(file);
- }
- int FileScan()
- {
- FILE *file;
- file = fopen(SOUBOR, "r");
- char c;
- int pocetZnaku = 0;
- while (!feof(file))
- {
- c = fgetc(file);
- pocetZnaku = pocetZnaku + 1;
- }
- printf("Pocet znaku v souboru %d\n\n", pocetZnaku-1);
- fclose(file);
- return pocetZnaku-1;
- }
- void producenti(int blok, char *p)
- {
- int *cetnosti = calloc(POCETZNAKU, sizeof(int)); // alokace pole velikosti POCETZNAKU * INT a vyplni hodnoty na 0
- int i = 0;
- int j ;
- for (i = 0; i < blok; i++)
- {
- printf("%c %d\n", p[i], i);
- for (j = 0; j < POCETZNAKU; j++)
- {
- if (poleZnaku[j] == p[i])
- {
- cetnosti[j] += 1;
- }
- }
- }
- getchar();
- for (i = 0; i < POCETZNAKU; i++) // tisk vysledku
- {
- printf("cetnosti %c %d \n", poleZnaku[i], cetnosti[i]);
- }
- }
- void* producentFunctions(void *arg)
- {
- blck *t_blok;
- t_blok = (blck *)arg;
- FILE *f = fopen("vysledek.txt", "w");
- int *cetnosti = calloc(POCETZNAKU, sizeof(int)); // alokace pole velikosti POCETZNAKU * INT a vyplni hodnoty na 0
- int i = 0;
- int j;
- fprintf(f,"vlakno: %d\n", pthread_self());
- printf( "vlakno: %d\n", pthread_self());
- for (i = 0; i < t_blok->delkaBlok; i++)
- {
- printf("%c %d\n", t_blok->blok[i], i);
- for (j = 0; j < POCETZNAKU; j++)
- {
- if (poleZnaku[j] == t_blok->blok[i])
- {
- cetnosti[j] += 1;
- }
- }
- }
- //getchar();
- for (i = 0; i < POCETZNAKU; i++) // tisk vysledku
- {
- printf("cetnosti %c %d \n", poleZnaku[i], cetnosti[i]);
- }
- }
- void* konzumer()
- {
- }
- //TODO vlakna - pomoci pipe viz saly, pocet pipe = POCETZNAKU
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement