1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным.
В описании темы указываем язык!!!
#include <algorithm> #include <iostream> #include <fstream> #include <string> #include <vector> #include <windows.h> using namespace std; //использование стандартного пространства имен
bool ForCompanation(string word1, string word2)//функция-предикат для сортировки { return word1.size() > word2.size();//возврашает true , если длина 1го слова < 2го слова }
bool ThreadFunction(char *);//прототип функции
CRITICAL_SECTION Crit; char bufc;//символ для формирования имени рез. файла string rezfilename = "Результат"; clock_t StartTime, EndTime;//переменные для фиксации время работы программы
int main(int argc, char *argv[]) { InitializeCriticalSection(&Crit); DWORD ID[10];//массив DWORD для записи ID потоков HANDLE ThreadHandle[10];//массив дескрипторов для потоков rezfilename += itoa(argc - 1, &bufc, 10);//преобразуем кол-во аргументов-1 в символ rezfilename += ".txt";//добовляем расширение файла StartTime = clock(); if (argc < 2 || argc > 11)//если кол-во аргументов <2 или >11 { cout << "Ne verno vvedeni parametry zapuska!"; exit(0);//выход из программы } //читаем файлы for (int i = 1; i <= argc - 1; i++)//цикл от 1 до кол-ва указанных файлов { ThreadHandle[i] = CreateThread(NULL,0, LPTHREAD_START_ROUTINE( ThreadFunction), argv[i], CREATE_SUSPENDED,&ID[i]);//запуск функции на обработки файла,argv[i] - имя файла if (ThreadHandle == NULL)//если поток не создан то выход из приложения { cout << "Error thread!"; exit(0); } else ResumeThread(ThreadHandle[i]);//иначе "будим" поток } WaitForMultipleObjects(argc, ThreadHandle, TRUE,INFINITE);//функция EndTime = clock();//записываем текущее время что бы посчитать время обработки cout << "\nVremya obrabotki : " << EndTime - StartTime << " ms"; DeleteCriticalSection(&Crit); return 0; }
bool ThreadFunction(char *fname) { string filestring;//строка для хранения считанного файла string buffer;//строка для хранения временных переменных ofstream rezfile;//файл результатов ifstream file;//логич. файл для чтения char d = ' ';//символ пробел - разделитель слов unsigned int dcount = 0;//кол-во пробелов в предложении unsigned int DPos = 0;//переменная хранит положение пробела в строке vector<string> ArrayOfWords;//массив-вектор из слов file.open(fname, ios::binary);//открываем файл file.seekg(0, std::ios_base::end);//помешаем указатель внутри файла в конец файла filestring.resize(file.tellg());//изменяем размер строки по длине файла file.seekg(0, std::ios_base::beg);//помешает указатель внутри файла в начало файла char ch[filestring.size()];//создаем чар-массив размером xstr file.read(ch, filestring.size());//читаем данные размером строки xstr в чар массив из файла file.close();//закрываем файла filestring = ch;//присваиваем строке xstr значение массива mychar dcount = 0;//обнуляем позицию разделителя слов for (size_t i = 0; i < filestring.size(); i++) //size_t = максимальный размер типа int в системе = размеру unsigned int //цикл до конца строки(кол-во итераций = размеру строки s) if (filestring.at(i) == d)//если символ на i-ой позиции строки s= разделителю devider dcount++;//то увеличить кол-во разделителей на 1 buffer.clear();//очищаем строку DPos = 0;//обнуляем позицию разделителя for (size_t i = 0; i < dcount + 1; i++)//цикл чтения слов из целой строки { DPos = filestring.find(d);//запоминаем позицию пробела buffer.append(filestring, 0, DPos);//записывает слово в спомогательную строку filestring.erase(0, DPos + 1);//удаляем записанное слово ArrayOfWords.push_back(buffer);//записываем слово в массив-вектор buffer.clear();//очищаем строку }
//==============вот с этого места вообще перестает выводить что-либо в потоки вывода.
filestring.clear();//очишаем строку содержавшую содержание файла sort(ArrayOfWords.begin(), ArrayOfWords.end(), ForCompanation);//сортировка по длине слова sort(ArrayOfWords.begin(), ArrayOfWords.end());//сортировка по алфавитному порядку ArrayOfWords.erase(ArrayOfWords.begin() + 100, ArrayOfWords.end());//удаляем не нужные слова(от 100 слова и до конца массива) EnterCriticalSection(&Crit);//входим в крит. секцию rezfile.open(rezfilename.data(), ios::app);//открываем рез. файл на дозапись rezfile << "\nВот 100 самых длинных слов в алфавитном порядке для файла "//запись в рез. файл заголовка << fname << " : " << endl;//и имени обрабатываемого файла EndTime = clock(); for (size_t i = 0; i < ArrayOfWords.size(); i++) // //цикл записи слов в рез. файл от 0 до размера массива ArrayOfWords rezfile << ArrayOfWords[i] << endl;//запись i-го слова в рез. файл rezfile.close(); LeaveCriticalSection(&Crit);//выход из крит. секции return 0; }
Сдается мне, где-то я с потоками ввода/вывода напортачил, переполняются они что-ли?В чем может быть проблема?На кол-во комментариев не обращайте внимания, пишу для друга почти не знакомого с c/c++.. Забыл добавить, что для теста необходимо запускать через cmd, указывая при запуске пути к текстовому файлу, содержащему текст без знаков препинания, в общем слова разделенные между собой пробелами.
Сообщение отредактировано: Andrewshkovskii - 3.01.2009 13:28
Запускаю программу. Файл "Результат3.txt" создан, только содержит не 100 самых длинных слов, поскольку надо немного по-другому сортировать, чтобы было именно 100 самых длинных:
sort(ArrayOfWords.begin(), ArrayOfWords.end(), ForCompanation); // сортировка по длине слова ArrayOfWords.erase(ArrayOfWords.begin() + 100, ArrayOfWords.end()); sort(ArrayOfWords.begin(), ArrayOfWords.end()); // сортировка по алфавитному порядку
Ну, и что-то намудрено у тебя с крит. секциями, обрабатывается только первый файл, остальные потоки не получают доступа в КС, и не обрабатываются... Но с потоками нет никакой проблемы, все нормально... Проверяй код.