#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, указывая при запуске пути к текстовому файлу, содержащему текст без знаков препинания, в общем слова разделенные между собой пробелами.