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

Пиши прогу которая вытаскивает email адреса из файла. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Grex
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 55
27.06.2011, 04:07     Пиши прогу которая вытаскивает email адреса из файла. #1
Добрый день.
Хочу реализовать программку в c++ builder, которая вытаскивает из txt файла все email адреса и записывает их в отдельный файл.
Может кто-то подкинет мне кусочек кода который правильно ищет @ пробел до и пробел после(тобишь сам email) в тексте.
Выглядит как попрошайничество, но я вреале перерыл много материала в интернете и ничего дельного не нашел.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2011, 04:07     Пиши прогу которая вытаскивает email адреса из файла.
Посмотрите здесь:

Написать прогу, которая выводит на экран содержимое файла C++
Требуется написать прогу которая преобразуют двоичное число в десятичное C++
C++ Как написать прогу которая удалит все программы с компьютера
Написать прогу, которая считывает предложения из txt и выводит их на экран в обратном порядке C++
Нужно написать прогу которая создаст в двух текстовых файлах А и В порядок числ до 17 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
27.06.2011, 05:31     Пиши прогу которая вытаскивает email адреса из файла. #2
Вот написал что в голову пришло.
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <vcl.h>
#include <ctype.h>
#pragma hdrstop
 
 
#pragma argsused
 
 
// посмотрим сколько растояние  до конца слова
int  pos_next(const char* str) {
    int len = 0;
    do {
         if(! isalnum(*str) && *str != '.' && *str != '-')
              break;
         else
              len++;
    } while(*str++ != '\0');
    str -= 1;
    return (*str == '.' || *str == '-') ? len - 1 : len;
}
 
// продвигаемся назад до  начала слова
int  pos_prev(const char* str, int pos) {
    int len = pos;
    --str;
    while(pos--) {
         if(! isalnum(*str) && *str != '.' && *str != '-')
                break;
         else
                len--;
         --str;
    }
    return len;
}
 
// анализирующея функция
bool  analyzer(const char* str) {
  int  abc = 0, dot = 0;
 
  if(! isalpha(*str) )
        return false;
 
  while(*str != '@' && *str != '\0') {
        if(isalnum(*str))
             abc++;
       if( *str == '.' || *str == '-')
             dot++;
        *str++;
  }
 
  if( dot > 2 || ! abc)
        return false;
 
  dot = abc = 0;
  *str++;
 
  do {
        if(isalpha(*str))
             abc++;
        if( *str == '.')
             dot++;
  } while( *str++ != '\0' );
 
  if( dot > 2 || abc < 2 )
        return false;
 
  return true;
}
 
 
 
 
int main(int argc, char* argv[]) {
 
       AnsiString  text = "";
 
       TStringList*  fp  = new TStringList();
       fp->LoadFromFile("X:\\src.txt");  // открываем файл для парсирования
       text = fp->GetText();
       fp->Clear();
       delete fp;
       fp = NULL;
 
       fp = new TStringList();
 
       const char* str = text.c_str();
       int   pos           = 0;
       do {
 
             if( *str == '@' ) {
                  int first   = pos_prev(str, pos);
                  int last   = pos_next(str + 1);
                  AnsiString test = text.SubString(first + 1, pos - first + last + 1);
                  if(analyzer(test.c_str()))
                        fp->Add(test);
             }
             pos++;
 
       } while( *str++ != '\0' );
 
       fp->SaveToFile("X:\\email.txt");  // сохраняем email в файл, в виде списка
       fp->Clear();
       delete fp;
       fp = NULL;
 
       system("pause");
 
    return 0;
}
Grex
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 55
27.06.2011, 07:07  [ТС]     Пиши прогу которая вытаскивает email адреса из файла. #3
Цитата Сообщение от xAtom Посмотреть сообщение
Вот написал что в голову пришло.
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <vcl.h>
#include <ctype.h>
#pragma hdrstop
 
 
#pragma argsused
 
 
// посмотрим сколько растояние  до конца слова
int  pos_next(const char* str) {
    int len = 0;
    do {
         if(! isalnum(*str) && *str != '.' && *str != '-')
              break;
         else
              len++;
    } while(*str++ != '\0');
    str -= 1;
    return (*str == '.' || *str == '-') ? len - 1 : len;
}
 
// продвигаемся назад до  начала слова
int  pos_prev(const char* str, int pos) {
    int len = pos;
    --str;
    while(pos--) {
         if(! isalnum(*str) && *str != '.' && *str != '-')
                break;
         else
                len--;
         --str;
    }
    return len;
}
 
// анализирующея функция
bool  analyzer(const char* str) {
  int  abc = 0, dot = 0;
 
  if(! isalpha(*str) )
        return false;
 
  while(*str != '@' && *str != '\0') {
        if(isalnum(*str))
             abc++;
       if( *str == '.' || *str == '-')
             dot++;
        *str++;
  }
 
  if( dot > 2 || ! abc)
        return false;
 
  dot = abc = 0;
  *str++;
 
  do {
        if(isalpha(*str))
             abc++;
        if( *str == '.')
             dot++;
  } while( *str++ != '\0' );
 
  if( dot > 2 || abc < 2 )
        return false;
 
  return true;
}
 
 
 
 
int main(int argc, char* argv[]) {
 
       AnsiString  text = "";
 
       TStringList*  fp  = new TStringList();
       fp->LoadFromFile("X:\\src.txt");  // открываем файл для парсирования
       text = fp->GetText();
       fp->Clear();
       delete fp;
       fp = NULL;
 
       fp = new TStringList();
 
       const char* str = text.c_str();
       int   pos           = 0;
       do {
 
             if( *str == '@' ) {
                  int first   = pos_prev(str, pos);
                  int last   = pos_next(str + 1);
                  AnsiString test = text.SubString(first + 1, pos - first + last + 1);
                  if(analyzer(test.c_str()))
                        fp->Add(test);
             }
             pos++;
 
       } while( *str++ != '\0' );
 
       fp->SaveToFile("X:\\email.txt");  // сохраняем email в файл, в виде списка
       fp->Clear();
       delete fp;
       fp = NULL;
 
       system("pause");
 
    return 0;
}
Благодарю Атом ), только вот создал форму, кинул кнопку, запихнул в обработчик кнопки твой код, а компилятор мне ошибок насыпал .
C++
1
[BCC32 Error] Project1.cpp(3): E2209 Unable to open include file 'vcl.h'
странно, что билдер не может открыть стандартную библиотеку. Сейчас буду его переустанавливать.
co6ak
27.06.2011, 11:29
  #4

Не по теме:

спамить будешь?

Grex
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 55
27.06.2011, 11:55  [ТС]     Пиши прогу которая вытаскивает email адреса из файла. #5
Цитата Сообщение от co6ak Посмотреть сообщение

Не по теме:

спамить будешь?

Вопрос прям в лоб... .
Нет, не спамить. Мне нужно выдернуть майлы из .txt файла, который забит лишним текстом.
..ну и я задам вопрос.
Откуда такой интерес?
co6ak
27.06.2011, 12:05
  #6

Не по теме:

приобретенная ненависть к спамерам. нужно знать врага в лицо

voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,694
27.06.2011, 12:30     Пиши прогу которая вытаскивает email адреса из файла. #7
Только вот не все, что "<пробел>.....@......<пробел>" является мылом.....

Добавлено через 50 секунд
И не любое мыло попадет в ваше условие
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
27.06.2011, 12:41     Пиши прогу которая вытаскивает email адреса из файла. #8
Grex,

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
#include <iostream>
#include <string>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <boost/regex.hpp>
 
void PrintValue(std::string str)
{
    std::cout << str << std::endl;
}
 
int main()
{
    boost::regex RegString("[a-zA-Z0-9_\\.]+@([a-zA-Z0-9]+\\.)+[a-zA-Z]{2,4}");
    std::string text;
    std::ifstream input("input.txt");
    std::istream_iterator <std::string> eof;
    std::istream_iterator <std::string> ptr(input);
 
    if (!input.is_open())
    {
        std::cout << "Can't open file" << std::endl;
        std::cin.get();
    }
 
    while (ptr != eof)
    {
        text += *ptr++;
        text.insert(text.size(), " ");
    }
 
    std::string::const_iterator startIt = text.begin();
    std::string::const_iterator endIt = text.end();
    boost::smatch results;
    std::vector <std::string> resultsEmail;
 
    while (boost::regex_search(startIt, endIt, results, RegString))
    {
        resultsEmail.push_back(results[0]);
        startIt = results[0].second;
    }
 
    std::for_each(resultsEmail.begin(), resultsEmail.end(), PrintValue);
 
    std::cin.get();
    return 0;
}
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,694
27.06.2011, 12:48     Пиши прогу которая вытаскивает email адреса из файла. #9
nameless, теперь у нас есть еще "домайн.рф"

и еще вот: http://ex-parrot.com/~pdw/Mail-RFC822-Address.html
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
27.06.2011, 12:52     Пиши прогу которая вытаскивает email адреса из файла. #10
voral, Думаю автору не составит проблем расширить регулярное выражение, на все остальные случаи жизни
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2011, 21:12     Пиши прогу которая вытаскивает email адреса из файла.
Еще ссылки по теме:

C++ Разработать программу, которая вводит адрес электронной почты и проверяет синтаксис введенного адреса
C++ Прочитать из текстового файла IP адреса
C++ Написать прогу которая заменяет одну строку на другую

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

Или воспользуйтесь поиском по форуму:
Grex
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 55
27.06.2011, 21:12  [ТС]     Пиши прогу которая вытаскивает email адреса из файла. #11
Большое спасибо за советы, очень вам благодарен.
Yandex
Объявления
27.06.2011, 21:12     Пиши прогу которая вытаскивает email адреса из файла.
Ответ Создать тему
Опции темы

Текущее время: 13:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru