unvisibleman

Mthreads searching for a word

Apr 22nd, 2014
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.93 KB | None | 0 0
  1. #include <thread>
  2. #include <time.h>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <string.h>
  6.  
  7. using namespace std;
  8.  
  9. char* buf; // буфер для загруженного файла
  10. int div_pos; // точка встречи потоков
  11. int length; // длина файла
  12. int cnt[2]; // счетчики для обоих потоков
  13. char to_find[2][12]; //две одинаковые строки искомой строки
  14.  
  15. void findit(int start){
  16.     int min, max, my;
  17.     char word[12]; //максимальный размер слова 12 символов
  18.     if (!start){ // если передали ноль
  19.         min=0; // то ищем с начала
  20.         max=div_pos; // до середины
  21.         my=0; // наши счетчики - первые
  22.     } else { // если передали не ноль, то это середина
  23.         min=div_pos; // от неё и пляшем
  24.         max=length; // до конца
  25.         my=1; // и наш счетчик второй
  26.     }
  27.    
  28.     for(int i=min, j=0; i<max; i++){
  29.         if(buf[i]!=' ' && buf[i]!='.' && buf[i]!=','){ // если не пробел
  30.             word[j++]=buf[i]; //складываем символ в буферок
  31.         }else { //если пробел
  32.             word[j]=0; //дописываем нулевой символ чтоб стркмп не зациклилсо
  33.             if(!strcmp(word, to_find[my])){
  34.                 cnt[my]++; // если одинаковые, то увеличиваем СВОЙ счетчик
  35.                 j=0; //буферок не чистим, а просто переходим в его начало
  36.             }
  37.         } // конец иначе
  38.     } // конце фора
  39. }
  40.  
  41. int main(int argc, char **argv){
  42.     char* file = argv[1]; //"simple.txt";
  43.  
  44.     /*clock_t start,finish;
  45.     double result;
  46.     start=clock();*/
  47.  
  48.     ifstream ifs(file);
  49.     if (!ifs.is_open() ){
  50.         cerr << "Can't open file!" << endl;
  51.         return 1;
  52.     }
  53.  
  54.     cout << "Word to find: ";
  55.     cin >> to_find[0];
  56.     cout<<"Ok starting\n";
  57.     strcpy(to_find[1], to_find[0]); // сделаем две одинаковые строки, чтобы потоки не спорили за доступ
  58.  
  59.     ifs.seekg (0, ifs.end); // вычисляем размер файла
  60.     length = ifs.tellg();
  61.     ifs.seekg (0, ifs.beg);
  62.     buf = new char [length]; // и выделяем память
  63.     ifs.read (buf, length); // загружаем если удалось открыть
  64.     ifs.close();
  65.     div_pos = length/2+1; // координата встречи потоков
  66.     while(buf[div_pos--]!=' '); // поправляем её, чтобы не попала на слово
  67.  
  68.     thread one = thread(findit, 0);
  69.     thread two = thread(findit, div_pos);
  70.     one.join();
  71.     two.join();
  72.  
  73.     //finish=clock();
  74.     //result = (double)(finish-start);
  75.     int total=cnt[0] + cnt[1]; // суммируем сколько всего находок :D
  76.     if (!total) cout<<"No words found."<<endl;
  77.     else cout<<"Found "<<total<<" word(s)"<<endl;
  78.     //cout << "Time:" << result << endl;
  79.  
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment