Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Valuh
0 / 0 / 0
Регистрация: 04.07.2010
Сообщений: 70
#1

создание нитей - C++

08.10.2011, 21:48. Просмотров 2631. Ответов 3
Метки нет (Все метки)

Привет всем!
Задание: Написать программу, создающую два потока. Оба потока одновременно читают один и тот же текстовый файл. Первый поток считает количество символов в файле, второй количество пробелов. После окончания потоки должны создать один файл, записать в него результаты работы и идентифицировать себя;

Вот готовый листинг:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// 55.cpp : main project file.
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
#include <stdio.h>
#include <windows.h>
 
using namespace std;
 
 
 
HANDLE Threads[2], sem; //описываем 2 потока и семафор
DWORD dwThreadID; //описываем функцию-поток
 
int allSimbols = 0; //счетчик символов
int allSpace = 0; //счетчик пробелов
FILE *ofs; //файл для вывода результата
bool flag = 0; //переменная-флажок для проверки, создался ранее файл или нет
 
DWORD WINAPI thread0() //эта нить считает общее количество символов
{
     ifstream ifs ("input.txt"); //открываем файл с текстом для анализа
     string s; //рабочая строка
     allSimbols = 0; //обнуляем счетчик символов
     while (getline(ifs, s)) //вводим из файла строку
     {
          allSimbols+=s.length(); //и наращиваем счетчик символов на длину строки
     }
     ifs.close(); //закрываем файл из которого вводили
     WaitForSingleObject(sem, INFINITE); //ждем пока не освободится семафор
if (flag == 0)                         
{   
  ofs = fopen("output.txt","w"); //если флажок нулевой, создаем файл для 
  flag = 1;                     //вывода результата и меняем флажок на 1
}
     fprintf(ofs, "1: file consists of "); //пусть это будет поток с номером 1 (но он 
     fprintf(ofs,"%d", allSimbols); //легко может выполняться и вторым по счету) в этих
     fprintf(ofs, " chars \n"); //трех строчках он идентифицируется и выводит результат
 
     ReleaseSemaphore(sem, 1, NULL); //нить закончила работу с файлом вывода и можно 
     return 0;                       //освободить семафор, что и было сделано
}
 
DWORD WINAPI thread1() //эта нить считает количество пробелов
{
     ifstream ifs ("input.txt"); //открываем файл с нужным текстом для чтения
     string s; //рабочая строка
     allSpace = 0; //обнуляем счетчик пробелов
     while (getline(ifs, s)) //вводим из файла строку
     {
         for(int i=0; i < s.length(); i++)
         if (s[i] == ' ')
         {
             allSpace++; //и проходя по строке считаем пробелы и наращиваем счетчик
         }
     }
     ifs.close(); //закрываем файл из которого вводили
     WaitForSingleObject(sem, INFINITE); //ждем пока не освободится семафор
     if (flag == 0)
     {
         ofs = fopen("output.txt","w"); //если флажок нулевой, создаем файл для
         flag = 1;                     //вывода результата и меняем флажок на 1
     }
     fprintf(ofs, "2: there are "); //пусть это будет поток с номером 2(но он легко может
     fprintf(ofs,"%d", allSpace); //выполняться и первым по счету) в этих трех строчках
     fprintf(ofs, " spaces in this file\n"); //он идентифицируется и выводит результат
     ReleaseSemaphore(sem, 1, NULL); //нить закончила работу с файлом вывода и можно
     return 0;                       //освободить семафор, что и было сделано
}
 
 
int main(array<System::String ^> ^args)
{
    sem = CreateSemaphore(NULL, 1, 1, (LPCWSTR)"semaphor"); //создаем семафор
    Threads[0]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread0, NULL, 0, NULL);  
    Threads[1]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread1, NULL, 0, NULL);  //создаем нити
      
    WaitForMultipleObjects(2, Threads, TRUE, INFINITE);//ждем пока отработают нити
    cout << "Chislo Simvolov in file are " << allSimbols << ", chislo spaces are " << allSpace << endl; 
    cout << "Otchet zanesen in file output.txt" << endl << endl;
    cout << "Press enter...";  // выводим результат работы на экран
    getch(); 
    fclose(ofs); //закрываем выходной файл
    CloseHandle(sem); //закрываем семафор
 
    return 0;
}

объясните пожалуйста, что значит строчка ofs = fopen("output.txt","w"); , а именно "w"?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2011, 21:48     создание нитей
Посмотрите здесь:

Синхронизация работы нитей - C#
Синхронизировать три нити одного процесса с помощью автоматической синхронизации. Каждая нить выводит на экран монитора два ...

Задача с блоками и натяжением нитей - Механика
Помогите пожалуйста решить задачу, вот условие : Несколько тел массами m1=0.6 кг, m2=0.6 кг, m3=2 кг соединены невесомыми нерастяжимыми...

Определить силу натяжения нитей Т2 и Т3 - Механика
Дано: m1=500 кг; m2=85 кг; p2=35; R2=20 м; r2=15 м; a1=1,5 м/с^2, где p-радиус инерции 2 блока. Ф1 - сила инерции и равна 750 Н; T1 - сила...

Чтение COM порта использование нитей - C++ Qt
Здравствуйте! Пытаюсь считать данные с COM порта, данные поступают периодически, без остановки. С этим кодом данные получаю в нужном виде,...

Ускорение и силы натяжения нитей - Механика
несколько тел массой m1 и m2 соединены невесомыми нерастяжимыми нитями перекинутыми через блоки массой m0.Угол который составляет наклонная...

Процесс порождает 10 дополнительных нитей - C++ WinAPI
Вот было такое задание: Процесс порождает 10 дополнительных нитей, каждая из которых выдает на экран сообщение о своем запуске и свой...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
08.10.2011, 22:31     создание нитей #2
Цитата Сообщение от Valuh Посмотреть сообщение
объясните пожалуйста, что значит строчка ofs = fopen("output.txt","w"); , а именно "w"?
"w" Create an empty file for writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
"w" - Создать пустой файл для чтения. Если файл с таким именем уже существует, то его содержимое стирается и файл будет считаться новым пустым фалом.
Valuh
0 / 0 / 0
Регистрация: 04.07.2010
Сообщений: 70
08.10.2011, 22:57  [ТС]     создание нитей #3
Спасибо lazybiz, вот еще вопрос: можно ли три строчки переделать в одну:
C++
1
2
3
fprintf(ofs, "1: file consists of "); //пусть это будет поток с номером 1 (но он 
     fprintf(ofs,"%d", allSimbols); //легко может выполняться и вторым по счету) в этих
     fprintf(ofs, " chars \n"); //трех строчках он идентифицируется и выводит результат
и что такое %d?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2011, 23:00     создание нитей
Еще ссылки по теме:

Найти силу взаимодействия нитей - Электричество и магнетизм
Две скрещивающиеся взаимно перпендикулярные нити бесконечной длины заряжены равномерно с линейной плотностью. найти силу их взаимодействия....

Найти силы натяжения всех нитей - Механика
Если известны массы всех блоков и груза, углы Альфа и Бета, жёсткость пружины, радиусы и инерции, коэффициент трения, а также радиусы...

Задача на динамику связанная с натяжением нитей - Механика
Помогите пожалуйста решить задачу: 1. Три тела соединены невесомыми нерастяжимыми нитями, перекинутыми через блоки, массами которых...

Напряженность двух полубесконечных нитей. помогите - Электричество и магнетизм
не могу разобраться, помогите кто чем может :jokingly:

Threads: Создать N нитей, запускаемых в некотором порядке - C Linux
Здравствуйте, дана задача: при запуске в программу приходит аргумент N. В самой программе должны создаваться N нитей, запускаться в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
08.10.2011, 23:00     создание нитей #4
Конечно можно.
C
1
fprintf( ofs, "1: file consists of %d chars \n", allSimbols )
%d - это знаковое десятичное целое, т.е. обычное целое число (например типа int).
Yandex
Объявления
08.10.2011, 23:00     создание нитей
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru