Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <thread>
- #include <time.h>
- #include <iostream>
- #include <fstream>
- #include <string.h>
- using namespace std;
- char* buf; // буфер для загруженного файла
- int div_pos; // точка встречи потоков
- int length; // длина файла
- int cnt[2]; // счетчики для обоих потоков
- char to_find[2][12]; //две одинаковые строки искомой строки
- void findit(int start){
- int min, max, my;
- char word[12]; //максимальный размер слова 12 символов
- if (!start){ // если передали ноль
- min=0; // то ищем с начала
- max=div_pos; // до середины
- my=0; // наши счетчики - первые
- } else { // если передали не ноль, то это середина
- min=div_pos; // от неё и пляшем
- max=length; // до конца
- my=1; // и наш счетчик второй
- }
- for(int i=min, j=0; i<max; i++){
- if(buf[i]!=' ' && buf[i]!='.' && buf[i]!=','){ // если не пробел
- word[j++]=buf[i]; //складываем символ в буферок
- }else { //если пробел
- word[j]=0; //дописываем нулевой символ чтоб стркмп не зациклилсо
- if(!strcmp(word, to_find[my])){
- cnt[my]++; // если одинаковые, то увеличиваем СВОЙ счетчик
- j=0; //буферок не чистим, а просто переходим в его начало
- }
- } // конец иначе
- } // конце фора
- }
- int main(int argc, char **argv){
- char* file = argv[1]; //"simple.txt";
- /*clock_t start,finish;
- double result;
- start=clock();*/
- ifstream ifs(file);
- if (!ifs.is_open() ){
- cerr << "Can't open file!" << endl;
- return 1;
- }
- cout << "Word to find: ";
- cin >> to_find[0];
- cout<<"Ok starting\n";
- strcpy(to_find[1], to_find[0]); // сделаем две одинаковые строки, чтобы потоки не спорили за доступ
- ifs.seekg (0, ifs.end); // вычисляем размер файла
- length = ifs.tellg();
- ifs.seekg (0, ifs.beg);
- buf = new char [length]; // и выделяем память
- ifs.read (buf, length); // загружаем если удалось открыть
- ifs.close();
- div_pos = length/2+1; // координата встречи потоков
- while(buf[div_pos--]!=' '); // поправляем её, чтобы не попала на слово
- thread one = thread(findit, 0);
- thread two = thread(findit, div_pos);
- one.join();
- two.join();
- //finish=clock();
- //result = (double)(finish-start);
- int total=cnt[0] + cnt[1]; // суммируем сколько всего находок :D
- if (!total) cout<<"No words found."<<endl;
- else cout<<"Found "<<total<<" word(s)"<<endl;
- //cout << "Time:" << result << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment