Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чтение txt файла с помощью потока thread 
:(
    Опции темы
novanova
Дата 4.12.2014, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.12.2014

Репутация: нет
Всего: нет



Как с помощью потока thread подключить txt файл и посчитать количество символов в нем?
PM MAIL   Вверх
swan013
Дата 4.12.2014, 11:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

int main()
{

/******************   Создаем поток   *****************/
pthread_t thread;
int result = -1;
if ((result = pthread_create(&thread, NULL, thread_function, NULL)) !=0)
        {
            perror("Создание первого потока!");
            return EXIT_FAILURE;
        }
/******************  Ждем завершение потока   *****************/
if ((result = pthread_join(thread, NULL)) != 0)
        {
            perror("Ждём поток");
            return EXIT_FAILURE;
        }
renurn 0;
}

void *thread_function (void* arg)
{
   fstream F;
   int n=0; char a;
   //открываем файл в режиме чтения
   F.open("D:\\sites\\accounts.txt");
   if (F)
   {
     while (!F.eof())
     {
      //чтение очередного значения из потока F в переменную a
      F>>a;
      //увеличение количества считанных симвлов
      n++;
     }
     //закрытие потока
     F.close();
     //вывод на экран количества считанных чисел
     cout<<"n="<<n<<endl;
     }
   }
   else cout<<" Файл не существует"<<endl;
}


Как то так примерно

Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
novanova
Дата 4.12.2014, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.12.2014

Репутация: нет
Всего: нет



а то, что мы создали поток, должно как то отобразиться в шапке программы?
ну там что то типа using namespace или #include?
PM MAIL   Вверх
novanova
Дата 4.12.2014, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.12.2014

Репутация: нет
Всего: нет



И, кстати, что значит это и дальнейшие такие обозначения?
pthread_t thread;
PM MAIL   Вверх
swan013
Дата 4.12.2014, 13:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ВОТ, почитайте)
Цитата

   pthread_t: дескриптор потока;
   


Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
novanova
Дата 4.12.2014, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.12.2014

Репутация: нет
Всего: нет



Спасибо за такую информацию большое!

остался последний вопрос)
почему мой Visual не понимает этих дескрипторов? Нужные библиотеки подключил.
PM MAIL   Вверх
novanova
Дата 4.12.2014, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.12.2014

Репутация: нет
Всего: нет



Вы компилировали свою программу?
PM MAIL   Вверх
swan013
Дата 4.12.2014, 14:14 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











не знаю как под виндой, но под линухом надо указывать компилятору опцию -lpthread
возможно в этом проблема


Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
baldina
Дата 4.12.2014, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Код

#include <fstream>
#include <iostream>
#include <thread>
#include <string>

using namespace std;

int main () {
  thread (
    [](const string& filename){
      ifstream file(filename, ios::binary|ios::ate);
      cout << file.tellg();
   }
   ,"file.txt")
   .join();
}

VC++ >=2012

Это сообщение отредактировал(а) baldina - 4.12.2014, 15:50
PM MAIL   Вверх
novanova
Дата 4.12.2014, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.12.2014

Репутация: нет
Всего: нет



ого
а можно пояснить, что значит(другими словами, что там написано?smile) само тело функции main()?

PM MAIL   Вверх
baldina
Дата 4.12.2014, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



создается объект типа thread (без имени, временный), в конструктор которого передается рабочая функция.
функция определена в месте использования (анонимная функция ака лямбда-функция).
внутри: для определения размера файла нет необходимости читать файл, достаточно переместить указатель в конец и выяснить его позицию (tellg).
остальное вам понятно.

Добавлено через 1 минуту и 59 секунд
то же самое, но на нормальном, понятном языке
Код

void worker (const string& filename) {
      // open the file and seek end
      ifstream file(filename, ios::binary|ios::ate);
      // print current position (equal file size in bytes)
      cout << file.tellg();
}

int main () {
   thread t(worker, "file.txt");
   t.join();
}

PM MAIL   Вверх
novanova
Дата 4.12.2014, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.12.2014

Репутация: нет
Всего: нет



А если мне надо будет, к примеру, приостановить работу программы, то что следует изменить в этом коде?
PM MAIL   Вверх
baldina
Дата 4.12.2014, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



что значит "приостановить"?
PM MAIL   Вверх
novanova
Дата 4.12.2014, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.12.2014

Репутация: нет
Всего: нет



нуу при введении определенного символа, пока программа работает, она заканчивает работу и выводит то количество символов, что успела посчитать до введения

а потом после введения очередного символа, она продолжает считать остатки

Это сообщение отредактировал(а) novanova - 4.12.2014, 15:50
PM MAIL   Вверх
baldina
Дата 4.12.2014, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



не очень понятно сформулировано (не понятно, как это соотносится с определением размера файла), но в общем:
в одном потоке делаете работу, в другом - ждете символ. 
первый поток периодически проверяет флаг - продолжать ли работу
когда символ введен, устанавливаете флаг, в результате второй поток завершается

см. тут
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.