С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Grex
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 55
#1

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

27.06.2011, 04:07. Просмотров 1402. Ответов 10
Метки нет (Все метки)

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

Написать прогу, которая выводит на экран содержимое файла - C++
Написать прогу, которая выводит на экран содержимое файла. Пожалуйста помогите. Добавлено через 34 минуты помогитееееее.(

Проверка синтаксиса Email адреса - C++
Помогите разработать программу, которая вводит адрес электронной почты и проверяет синтаксис введённого адреса. Результат выводится в виде...

получить email адреса из файла - PHP
Здраствуйте, помогите получить email-адреса из файлов формата .txt и .csv например файл text.txt с таким содержанием: test1@test.ru ...

Вытащить из excel-евского файла все email адреса (в файле может быть несколько листов) - PHP
Здравствуйте! подскажите, как

определить функцию, которая вытаскивает из списка числа - Lisp
Определить функцию, выбирающую из заданного списка все числовые атомы. С использованием подсписков.

Проверка email адреса - Bash
Задание: Написать программу, которая будет проверять email адрес на валидность. Под правильным email адресом подразумевается строка...

10
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
27.06.2011, 05:31 #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;
}
1
Grex
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 55
27.06.2011, 07:07  [ТС] #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'
странно, что билдер не может открыть стандартную библиотеку. Сейчас буду его переустанавливать.
0
co6ak
27.06.2011, 11:29
  #4

Не по теме:

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

0
Grex
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 55
27.06.2011, 11:55  [ТС] #5
Цитата Сообщение от co6ak Посмотреть сообщение

Не по теме:

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

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

Не по теме:

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

0
voral
501 / 481 / 83
Регистрация: 16.03.2008
Сообщений: 2,251
27.06.2011, 12:30 #7
Только вот не все, что "<пробел>.....@......<пробел>" является мылом.....

Добавлено через 50 секунд
И не любое мыло попадет в ваше условие
0
nameless
Эксперт С++
334 / 298 / 14
Регистрация: 16.06.2009
Сообщений: 486
27.06.2011, 12:41 #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;
}
0
voral
501 / 481 / 83
Регистрация: 16.03.2008
Сообщений: 2,251
27.06.2011, 12:48 #9
nameless, теперь у нас есть еще "домайн.рф"

и еще вот: http://ex-parrot.com/~pdw/Mail-RFC822-Address.html
0
nameless
Эксперт С++
334 / 298 / 14
Регистрация: 16.06.2009
Сообщений: 486
27.06.2011, 12:52 #10
voral, Думаю автору не составит проблем расширить регулярное выражение, на все остальные случаи жизни
1
Grex
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 55
27.06.2011, 21:12  [ТС] #11
Большое спасибо за советы, очень вам благодарен.
0
27.06.2011, 21:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2011, 21:12
Привет! Вот еще темы с ответами:

Отправка email на адреса из БД - C#
НАРОД проблема, как отпровлять письма я знаю, а вот как сделать так чтобы емайлы брались из базы, и брались например по 200 шт за раз?...

Валидация адреса email - C# WPF
Подскажите как сделать Проверку соответствия EMail в TextBox Чтобы был правельный формат MessageBox.Show(&quot;Неверный формат эл....

Генерация случайного email адреса - jQuery
Скажите пожалуйста, как поставить скрипт, который бы генерировал случайные email и все это запихать в value Добавлено через 3 часа 13...

Подмена адреса отправителя email-a PHPMailer - PHP
Здравствуйте, уважаемые форумчане. Однажды нашел для себя лёгкий способ отправлять мыло, с помощью либы PHPMailer, тогда она меня...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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