Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
11 / 11 / 5
Регистрация: 01.04.2015
Сообщений: 120

Распарсить файл с номерами телефонов и именами абонентов

21.05.2015, 15:12. Показов 3602. Ответов 38
Метки нет (Все метки)

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

0567610338 761-03-38, 050-560-77-26 Марина Ивановна
067-545-87-87 067-545-87-87 Ирина
0677114623 067-711-46-23, 744-07-67 Людмила Владимировна
097-243-49-11 097-243-49-11 Руслана
0562314350 31-43-50, 099-497-63-15 Яна

нужно построчно считать в программу , в программе сделать так чтобы вбыл найден номер мобильного и преобразован в формат 380665544333 и записан в новый файл , точно так же с именем Марина Ивановна например.

Подскажите хоть в какую сторону копать , считывать char массив или стринг ?
как вобще считывать строку и искать Имя и Отчество я так понимаю все это прописывать черз if else.
Сам код не нужно реализовывать интересно самому конечно сделать, буду благодарен за наводку

вобщем как считать в что то строки ?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.05.2015, 15:12
Ответы с готовыми решениями:

База данных телефонов абонентов
Ребят, нужна помощь на практику. Напишите пожалуйста код, иначе кранты мне. :wall: А. Создать таблицу, содержащую сведения о телефонах...

Запрос: Список абонентов компании с указанием номеров их телефонов
Задача:Список абонентов компании с указанием номеров их телефонов, при условии, что эти номера содержат в конце цифру 5. Помогите...

Создать файл, содержащий сведения о телефонах абонентов. Каждая запись имеет поля: фамилия абонентов, год
Помогите записать в файл, вывести информацию using System; using System.Collections.Generic; using System.Linq; using...

38
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
21.05.2015, 21:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от maestro4250 Посмотреть сообщение
когда доходит до русских символов прога крашится
C++
1
if (!isdigit((unsigned char)str[i]))
1
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
21.05.2015, 21:33
Цитата Сообщение от maestro4250 Посмотреть сообщение
но хочется самому
Похвально.

Не по теме:

Вот только смотреть больно на то, что тут понаписано... Короче говоря, last chance - если приложите архив, пока я спать не пошел.

0
11 / 11 / 5
Регистрация: 01.04.2015
Сообщений: 120
21.05.2015, 21:41  [ТС]
я так понял из за того что русский текст присутсвует в файле , как его обойти

Добавлено через 1 минуту
Цитата Сообщение от lss Посмотреть сообщение
if (!isdigit((unsigned char)str[i]))
а что это нам дало ? явное приведение строки к char ?
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
21.05.2015, 21:49
Цитата Сообщение от maestro4250 Посмотреть сообщение
а что это нам дало ?
То, что функции cctype требуют unsigned char, иначе, при знаковом char:
Цитата Сообщение от maestro4250 Посмотреть сообщение
когда доходит до русских символов прога крашится
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
21.05.2015, 22:03
maestro4250,
Перестаньте в С-стайле писать, если конечно у вас нет цели именно так написать. Ай да на С++?

И я опять это напишу
C++
1
2
3
4
5
6
std::ifstream ifile("fileName");//открыли файлик на четение
std::string str;//обявили переменную string в которую мы будем читать строку с файла
while (std::getline(ifile, str))//читаем строку с файла, до конца файла, в теле цикла на каждой итерации str хранит ровно одну строку из файла, т.е. до '\n'
{
    std::cout << str << std::endl;// выводим одну строку на экран на каждой итерации.
}

Далее я предлагаю удалить из строки все "-" Тут есть экзампл
и заменить всякие "," на " " Тут есть экзампл

Так же заведите вектор строк, а лучше не строк, а своих структур/классов:

C++
1
std::vector<std::string> vec;
Общая инфа по вектору
Экзампл как создать

Таким образом вы избавитесь от всех сложностей работы с памятью.
0
11 / 11 / 5
Регистрация: 01.04.2015
Сообщений: 120
21.05.2015, 22:05  [ТС]
Nosey, Спасибо =) но это сложно для меня )))) ,подскажите где именно должен лежать файл в какой папке ? Знаю что тупой вопрос но все же.
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
21.05.2015, 22:17
Цитата Сообщение от maestro4250 Посмотреть сообщение
подскажите где именно должен лежать файл в какой папке ? Знаю что тупой вопрос но все же.
У вас не открываетсяя файл вообще? или через ifstream? )
Если второе - то пути что у fopen что у fstream - одинаковые.

Добавлено через 7 минут
Цитата Сообщение от maestro4250 Посмотреть сообщение
Спасибо =) но это сложно для меня ))))
И я вас уверяю, там нет ничего сложного для вас
0
11 / 11 / 5
Регистрация: 01.04.2015
Сообщений: 120
21.05.2015, 22:31  [ТС]
та открывается уже , тут другая проблема в char массив копируются вместо - символы \0 и потом на вывод выводится не весь номер (( , фуу надоело.
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
#define _CRT_SECURE_NO_WARNINGS
#include <string>
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cctype> 
#define LENGTH_ARRAY 200
 
 
using namespace std;
 
void main()
{
    setlocale(LC_CTYPE, "Russian");
 
    ////F.open("C:\\Users\\Public\\Documents\\Database.txt");
    //O.open("C:\\Users\\Roma\\Desktop\\Database.txt");
 
 
    setlocale(LC_ALL, ".1251");                //Делаем допустимым вывод кириллицы в консоль.
    FILE *in = fopen("C:\\Users\\Roma\\Desktop\\Database.txt", "r"); //файл находится в папке main (папка main находится в папке с проектом)
    //параметр "r", то есть reed - позволит нам только считать информацию.
    if (in == NULL)                                   //если in(файл) равен NULL,значит он не может открыться.Либо путь не тот.
    {
        cout << "Ошибка в открытии файла in.txt" << endl;
    }
    else
    {
        char str[LENGTH_ARRAY];       //создаём строку(string) размером 64.
        fgets(str, LENGTH_ARRAY, in);   //записываем в str первую строку.
        cout << str;        //выводим на экран первую строку.
        char Number[20] = {};
        for (int i = 0; str[i]!=0; i++)
        {
            if (isdigit((unsigned char)str[i]))
            {
                cout << str[i];
                if (str[i]!='\0')
                {
                    Number[i] = str[i];
                
                }
    
            }
        }
        cout << endl;
        cout << Number << endl;
 
        _fcloseall();         //закрываем все открытые (в нашем случае один) файлы.
    }
    /*ifstream ifile("Database.txt");
    string str;
    getline(ifile, str);
    cin >> str;*/
 
 
 
    system("pause");
}
Добавлено через 53 секунды
Nosey, Понимаю на досуге как то вернусь к этой теме обязательно разберусь с вектором , а тут понимаете нужна программа еще на вчера )) как часто это бывает
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
21.05.2015, 22:39
Лучший ответ Сообщение было отмечено maestro4250 как решение

Решение

Цитата Сообщение от maestro4250 Посмотреть сообщение
в char массив копируются вместо - символы \0
Это странно, я вижу тут два варианта, но и слабо понял в чём у вас проблема:
1) кодировка, но мне ень смотреть в какой кодировке такое может происходить.
2) Очень маловероятный, ибо приложение должно было упасть - вы выходите за 20 символов в Number'e.

Цитата Сообщение от maestro4250 Посмотреть сообщение
Nosey, Понимаю на досуге как то вернусь к этой теме обязательно разберусь с вектором , а тут понимаете нужна программа еще на вчера )) как часто это бывает
Ну тогда как наскучит, открывайте , не зря же я это писал
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <string>
#include <sstream>
#include <memory>
#include <iterator>
 
class BookNode
{
    std::vector<std::string> phones_;
    std::vector<std::string> names_;
public:
    BookNode()
    {
    }
 
    void addPhone(const std::string& value)
    {
        phones_.push_back(value);
    }
 
    void addName(const std::string& value)
    {
        names_.push_back(value);
    }
 
    const typename std::vector<std::string>& names() const
    {
        return names_;
    }
 
    const typename std::vector<std::string>& phones() const
    {
        return phones_;
    }
};
 
std::ostream& operator<<(std::ostream& stream, const std::shared_ptr<BookNode>& book)
{
    std::copy(std::begin(book->names()), std::end(book->names()), std::ostream_iterator<std::string>(stream, " "));
    std::copy(std::begin(book->phones()), std::end(book->phones()), std::ostream_iterator<std::string>(stream, " "));
    stream << std::endl;
    return stream;
}
 
int main()
{
    std::ifstream ifile("Database.txt");
    std::string str;
    std::vector<std::shared_ptr<BookNode>> book;
    std::stringstream ss;
    std::string temp;
    while (std::getline(ifile, str))
    {
        std::replace(std::begin(str), std::end(str), ',', ' ');
        str.erase(std::remove(std::begin(str), std::end(str), '-'), std::end(str));
        ss.clear();
        ss.str(str);
 
        std::shared_ptr<BookNode> node;
        bool needNewNode = true;
 
        while (ss >> temp)
        {
            if (std::isdigit((unsigned char) temp[0]))
            {
                if (needNewNode)
                {
                    needNewNode = false;
                    node = std::make_shared<BookNode>();
                    book.push_back(node);
                }
                node->addPhone(temp);
            }
            else
            {
                needNewNode = true;
                node->addName(temp);
            }
        }
    }
 
    std::ofstream ofile("out.txt");
    std::copy(std::begin(book), std::end(book), std::ostream_iterator<std::shared_ptr<BookNode>>(ofile));
 
    return 0;
}
1
11 / 11 / 5
Регистрация: 01.04.2015
Сообщений: 120
21.05.2015, 22:41  [ТС]
и как в этом бреде записать Number в файл ?
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
21.05.2015, 22:47
Цитата Сообщение от maestro4250 Посмотреть сообщение
и как в этом бреде записать Number в файл ?
В моём или в вашем?

В вашем, в с-стайле:
fprintf али fputs.
И не забываемчтострока должна окончиваться нульсимволом.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
21.05.2015, 22:51
Цитата Сообщение от Nosey Посмотреть сообщение
В моём или в вашем?
В нашем.
0
11 / 11 / 5
Регистрация: 01.04.2015
Сообщений: 120
21.05.2015, 23:23  [ТС]
как записать разобрался но как убрать \0 символы , когда по циклу проходит то в отладке видно что char Numbers имеет вид [0],[6],[7],[/0],[5],[6],[7],[/0]- тоесть где в номере 067-566-80 были чертоки - , программа поставила \0 и получается символьный массив завершается
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
21.05.2015, 23:25
maestro4250, Приведите листинг сей програмки.
0
11 / 11 / 5
Регистрация: 01.04.2015
Сообщений: 120
21.05.2015, 23:27  [ТС]
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
#define _CRT_SECURE_NO_WARNINGS
#include <string>
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cctype> 
#define LENGTH_ARRAY 200
 
 
using namespace std;
 
void main()
{
    setlocale(LC_CTYPE, "Russian");
    setlocale(LC_ALL, ".1251");                //Делаем допустимым вывод кириллицы в консоль.
    FILE *in = fopen("C:\\Users\\Roma\\Desktop\\Database.txt", "r");
    FILE *inr = fopen("C:\\Users\\Roma\\Desktop\\Numbers.txt", "w");//файл находится в папке main (папка main находится в папке с проектом)
    //параметр "r", то есть reed - позволит нам только считать информацию.
    if (in == NULL)                                   //если in(файл) равен NULL,значит он не может открыться.Либо путь не тот.
    {
        cout << "Ошибка в открытии файла in.txt" << endl;
    }
    else
    {
        char str[LENGTH_ARRAY];       //создаём строку(string) размером 64.
        fgets(str, LENGTH_ARRAY, in);   //записываем в str первую строку.
        cout << str;        //выводим на экран первую строку.
        char Number[20] = {};
        for (int i = 0; str[i]!=0; i++)
        {
            if (isdigit((unsigned char)str[i]))
            {
            
                    /*fputs (str,inr);*/
                    Number[i] = str[i];
                
            }
        }
        cout << endl;
        cout << Number << endl;
        fputs(Number, inr);
 
        _fcloseall();         //закрываем все открытые (в нашем случае один) файлы.
    }
    /*ifstream ifile("Database.txt");
    string str;
    getline(ifile, str);
    cin >> str;*/
 
 
 
    system("pause");
}
у вас под сполером реализовано я так понял в ООП это все дело ?
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
21.05.2015, 23:39
maestro4250
Вы при записи в Number используете индекс из str. Надеюсь понятно объяснил)
C++
1
2
3
4
5
6
7
8
9
for (int i = 0, j = 0; str[i] != 0; i++)
        {
            if (isdigit((unsigned char) str[i]))
            {
                /*fputs (str,inr);*/
                Number[j] = str[i];
                ++j;
            }
        }
Цитата Сообщение от maestro4250 Посмотреть сообщение
у вас под сполером реализовано я так понял в ООП это все дело ?
От ООП там с гуькин нос, там просто С++ подход.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
21.05.2015, 23:41
Цитата Сообщение от maestro4250 Посмотреть сообщение
char Number[20] = {};
20 - мало.
0
11 / 11 / 5
Регистрация: 01.04.2015
Сообщений: 120
22.05.2015, 09:16  [ТС]
Nosey, Точно ведь вот я рак невнимательный . lss, я тоже так думаю.
Спасибо ребят. будем дальше долбить
0
11 / 11 / 5
Регистрация: 01.04.2015
Сообщений: 120
23.05.2015, 12:08  [ТС]
Если кому интересно сегодня добился что программа работает но : единственное что записывает одинаковые номера телефонов но это откорректируется вручную

листинг :

Кликните здесь для просмотра всего текста
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
110
111
112
113
114
115
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdlib>
#include <fstream>
#define MAX_LENGTH_LINE 200
#define MAX_NUMBER_LINE 200
#define MAX_NUME_LINE 100
#define NUMBER_LINE 13
using namespace std;
 
void main()
{
    setlocale(LC_CTYPE, "Russian");
    setlocale(LC_ALL, ".1251");
    char Line[MAX_LENGTH_LINE];
    char NumberLine[MAX_NUMBER_LINE];
    char Number[NUMBER_LINE] = {};
    //0675668160
    char AddNum[2] = { 3, 8 };
    FILE *in = fopen("C:\\Users\\Dmitriy\\Desktop\\Database.txt", "r"); 
    ofstream fout("C:\\Users\\Dmitriy\\Desktop\\Numbers.txt");
    ofstream ffout("C:\\Users\\Dmitriy\\Desktop\\Name.txt");//файл находится в папке main (папка main находится в папке с проектом)
    //  параметр "r", то есть reed - позволит нам только считать информацию.
    if (in == NULL)                                   //если in(файл) равен NULL,значит он не может открыться.Либо путь не тот.
    {
        cout << "Ошибка в открытии файла in.txt" << endl;
    }
    else
    {
        char Line[MAX_LENGTH_LINE];
        fgets(Line,MAX_LENGTH_LINE, in);   //записываем в str первую строку.
        while (!feof(in))    //пока не конец файла in ,мы исполняем цикл.
        {
            fgets(Line, MAX_LENGTH_LINE, in);
            cout << "Считана строка :" << endl;
            cout << Line<<endl;
            for (int i = 0, j = 0; i < MAX_LENGTH_LINE; i++)
            {
                if (isdigit((unsigned char)Line[i]) || Line[i] == ',' || Line[i] == ' ')
                {
                    NumberLine[j] = Line[i];
                    j++;
                }
                NumberLine[j + 1] = '\0';
 
            }
            int Length = strlen(NumberLine); \
                cout << "Строка преобразована в ::" << endl;
            cout << NumberLine << endl;
 
            do
            {
                char* Ptr = strchr(NumberLine, '0');
                char* Ptr1 = Ptr + 1;
                char* Ptr2 = Ptr + 2;
                if (((*Ptr1) == '6') || ((*Ptr1) == '9'))// номера начинаются на 050,09,06 вторая цифра отбирается
                {
                    strncpy_s(Number, Ptr, 10);
                    cout << "\nИзьят номер : "
                        << Number << endl;
                    char AddNumber[NUMBER_LINE] = { '3', '8' };// для добавления 
                    Length = strlen(Number);
                    cout << "\nНомер записан в формате : " << endl;
 
                    strcat(AddNumber, Number);
                    cout << AddNumber << endl;
                    fout << AddNumber << ",";
                }
                else if (((*Ptr1) == '5') && ((*Ptr2) == '0'))
                {
 
                    strncpy_s(Number, Ptr, 10);
                    cout << "\nИзьят номер : "
                        << Number << endl;
                    char AddNumber[NUMBER_LINE] = { '3', '8' };// для добавления 
                    Length = strlen(Number);
                    cout << "\nНомер записан в формате : " << endl;
 
                    strcat(AddNumber, Number);
                    cout << AddNumber << endl;
                    fout << AddNumber << ",";
 
                }
 
                *Ptr = '1';// ложим по указателю значение 1 чтобы strchr снова и снова не находил один и тот же 0 
            } while (strchr(NumberLine, '0'));
            fout << endl;
            cout << "\nТак же были изьяты следующие символы  :";
            char Name[MAX_NUME_LINE];
            Length = strlen(Line);
            for (int i = 0, j = 0; i < Length; i++)
            {
                if (isalpha((unsigned char)Line[i]) || Line[i] == ',' || Line[i] == '.')
                {
                    Name[j] = Line[i];
                    j++;
                }
                Name[j + 1] = '\0';
 
            }
            cout << Name << endl;
            ffout << Name << endl;
            cout << " Продолжить ? 1-да 0-выход " << endl;
            int choice;
            cin >> choice;
            system("cls");
        
        }
        
    }
 
    //fcloseall();         //закрываем все открытые (в нашем случае один) файлы.
    fout.close(); // закрываем файл
    system("pause");
}


Добавлено через 56 секунд
Всем спасибо очень были полезные советы без вас у меня не получилось бы =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.05.2015, 12:08

Ввести список, в котором указаны фамилии, инициалы, адрес и номера телефонов абонентов
Никак не могу понять, в чем ошибка. Все работает идеально до функции strcmp() Текст задачи: &quot;Ввести список, в котором...

Распарсить Json с динамическими именами
Вот такой Json нужно распарсить, не могу составить класс. { &quot;name1&quot;: { &quot;Age&quot;: 20, &quot;Rite&quot;: 1 ...

Записи с вариантами. Опишите телефонную книгу, содержащую номера телефонов городских и иногородних абонентов
Опишите, используя записи с вариантами, телефонную книгу, содержащую номера телефонов городских абонентов и иногородних, для которых указан...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru