IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Буфер вывода или кривой код., c++/minGW
Andrewshkovskii
сообщение 3.01.2009 1:43
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


 
#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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 26.07.2025 6:31
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"