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

Распарсить текстовый файл - C++

Восстановить пароль Регистрация
 
idaspin
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 45
28.07.2014, 01:32     Распарсить текстовый файл #1
Программно я могу получить список следующего вида:

Код
..., {
id: 7,
login: 'idaspin',
password: '638kjg1kjghd8xzckj2kj3hdhg876smnnm4jd'
}, {
id: 8,
login: 'marchall_95',
password: '8sd920gxzc3dasdada6947opkjgo92cv637',
status: 'vip'
},...
как я через c++ (из файла к примеру) могу вытащить все id'шники VIP пользователей?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2014, 01:32     Распарсить текстовый файл
Посмотрите здесь:

Текстовый файл UTF-8 сохранить как текстовый файл ANSI C++
Дан текстовый файл, содержащий целые числа. Определить в каждой четной строке максимальное число и записать результаты в новый текстовый файл C++
Даны натуральное , символьный файл и текстовый файл . Файл содержит 30 слов , каждое из которых будем называть ключевым C++
Можно ли распарсить XLS файл? C++
C++ Дано число k (< 10) и текстовый файл, содержащий более k строк. Создать новый текстовый файл, содержащий k последних строк исходного файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alexeyNET
7 / 7 / 2
Регистрация: 18.06.2014
Сообщений: 43
28.07.2014, 01:37     Распарсить текстовый файл #2
получите строку из файла (с помощью функции fgets(); );
проверьте, есть ли там строка id: (функция strstr(););
если есть разбейте строку на слова с помощью функции strtok, указав в разделители (:,);
возьмите второе слово из получившегося.
Вот и все)
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
28.07.2014, 05:34     Распарсить текстовый файл #3
alexeyNET, это какой-то не C++-way. Я бы STL использовал. Медленнее, зато код проще.
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
28.07.2014, 08:01     Распарсить текстовый файл #4
я бы так сделал...)
C++
1
2
3
4
5
6
7
8
string GetBetween(string target, string left, string right)
{
    size_t begin = target.find(left);
    size_t end = target.find(right);
    if(begin==string::npos || end==string::npos) return "";
    begin += left.size();
    return target.substr(begin, end - begin);
}
C++
1
GetBetween(targetStr, "id: ", ",");
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
28.07.2014, 09:52     Распарсить текстовый файл #5
idaspin, Распарсить файл в вектор адекватных структур. Найти нужные элементы.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
28.07.2014, 09:57     Распарсить текстовый файл #6
Похоже на json; если да, то просто нужен парсер json, и никакой возни.
idaspin
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 45
28.07.2014, 10:03  [ТС]     Распарсить текстовый файл #7
Ага всего-то
Еще осталось понять о чем вы говорите!

шутка, может не рационально но код написал уже(см тему выше)
компилятора нет... как появится и если у меня не получится, сделаю по вашим советам
krv
71 / 51 / 11
Регистрация: 10.07.2014
Сообщений: 328
28.07.2014, 11:14     Распарсить текстовый файл #8
Использование регулярных выражений не рассматривается?
К примеру TRegExpr от Сорокина
Если да - могу прикинуть код по данному заданию.
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,670
28.07.2014, 11:49     Распарсить текстовый файл #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/////////////////////////////////////////////////////////////////////////////////////////
//Программно я могу получить список следующего вида:
//..., 
//{
//id: 7,
//login: 'idaspin',
//password: '638kjg1kjghd8xzckj2kj3hdhg876smnnm4jd'
//}, 
//{
//id: 8,
//login: 'marchall_95',
//password: '8sd920gxzc3dasdada6947opkjgo92cv637',
//status: 'vip'
//},...
//
//как я через c++ (из файла к примеру) могу вытащить все id'шники VIP пользователей?
/////////////////////////////////////////////////////////////////////////////////////////
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string         T_str;
typedef T_str::size_type    T_pos;
/////////////////////////////////////////////////////////////////////////////////////////
char    const   LEFT_BRACE_SYMB                 =   '{';
char    const   RIGHT_BRACE_SYMB                =   '}';
char    const   APOSTROF_SYMB                   =   '\'';
char    const   SPACE_SYMB                      =   ' ';
char    const   COMMA_SYMB                      =   ',';
char    const   TAB_SYMB                        =   '\t';
T_str   const   COMMA_AND_SPACE_STR             =   T_str( 1, COMMA_SYMB ) + SPACE_SYMB;
T_str   const   VIP_WORD_IN_SINGLE_QUOTES       =   T_str( 1, APOSTROF_SYMB ) + "vip" + APOSTROF_SYMB;
T_str   const   ID_WORD_WITH_COLON_AND_SPACE    =   "id: ";
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_person
{
    //-----------------------------------------------------------------------------------
    int     ID_;
    T_str   login_;
    T_str   password_;
    bool    is_vip_status_;
    //-----------------------------------------------------------------------------------
    T_str   to_str()
    {
        std::ostringstream  sout;
 
        sout    <<  LEFT_BRACE_SYMB
                <<  ID_WORD_WITH_COLON_AND_SPACE        <<  ID_                             <<  COMMA_AND_SPACE_STR
                <<  "login: "       <<  APOSTROF_SYMB   <<  login_      <<  APOSTROF_SYMB   <<  COMMA_AND_SPACE_STR
                <<  "password: "    <<  APOSTROF_SYMB   <<  password_   <<  APOSTROF_SYMB;
 
        if( is_vip_status_ )
        {
            sout    <<  COMMA_AND_SPACE_STR
                    <<  "status: "
                    <<  VIP_WORD_IN_SINGLE_QUOTES;
        }
        
        sout    <<  RIGHT_BRACE_SYMB
                <<  std::endl;
 
        return  sout.str();
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
T_str   generate_and_get_rand_str()
{
    int     rand_str_len    =   rand() % 10 + 3;
    T_str   res_str;
 
    for( int  i = 0; i < rand_str_len; ++i )
    {
        res_str += 'a' + rand() % 26;
    }//for
 
    return  res_str;
}
/////////////////////////////////////////////////////////////////////////////////////////
T_str   generate_and_get_person_str_with_id
    (
        int         id,
        bool    &   is_vip
    )
{
    T_person    person  =   {
                                id,
                                generate_and_get_rand_str(),
                                generate_and_get_rand_str(),
                                is_vip  =   rand() % 2 == 0
                            };
 
    return  person.to_str();
}
/////////////////////////////////////////////////////////////////////////////////////////
void    generate_person_list_and_write_to_file( T_str    const   &   filename )
{
    std::ofstream   ofile( filename );
 
    std::cout   <<  std::endl
                <<  std::endl
                <<  std::endl
                <<  "Сгенерированы vip-персоны с ID:"
                <<  std::endl;
 
    for( int  i = 0; i < 7; ++i )
    {
        if( i > 0 )
        {
            ofile   <<  ", ";
        }
 
        bool    is_vip  =   false;
 
        ofile   <<  generate_and_get_person_str_with_id
                        (
                            i,
                            is_vip
                        );
 
        if( is_vip )
        {
            std::cout   <<  i
                        <<  TAB_SYMB;
        }
    }//for
}
/////////////////////////////////////////////////////////////////////////////////////////
void    print_id_of_vip_persons_found_in_file( T_str    const   &   filename )
{
    std::ifstream   ifile( filename );
    std::ostringstream  sout;
    sout    <<  ifile.rdbuf();
    T_str   file_str    =   sout.str();
 
 
    std::cout   <<  std::endl
                <<  std::endl
                <<  "Найдены в файле vip-персоны со следующими ID:"
                <<  std::endl;
 
    T_pos   right_pos   =   T_str::npos;
    T_pos   vip_pos     =   0;
 
    while   (
                (
                    vip_pos     =   file_str.rfind( VIP_WORD_IN_SINGLE_QUOTES, right_pos )
                )
                != T_str::npos
            )
    {
        T_pos   id_word_pos     =   file_str.rfind( ID_WORD_WITH_COLON_AND_SPACE, vip_pos );
        right_pos               =   id_word_pos;
        T_pos   num_begin_pos   =   file_str.find( SPACE_SYMB, id_word_pos      );
        T_pos   num_end_pos     =   file_str.find( COMMA_SYMB, num_begin_pos    );
 
        std::istringstream  ssin
            (
                file_str.substr( num_begin_pos, num_end_pos - num_begin_pos )
            );
 
        int     id  =   0;
        ssin    >>  id;
        std::cout   <<  id
                    <<  TAB_SYMB;
    }//while
 
    std::cout   <<  std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
    srand(unsigned(time(0)));
    for(;;)
    {
        const   T_str   FILE_NAME   =   "list.txt";
        generate_person_list_and_write_to_file  ( FILE_NAME );
        print_id_of_vip_persons_found_in_file   ( FILE_NAME );
        system("pause");
    }//for
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2014, 11:51     Распарсить текстовый файл
Еще ссылки по теме:

C++ Распарсить файл 3Dmax
Распарсить тексовый файл и вывести неодходимые значения в другой файл C++
C++ Распарсить xlsx-файл

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

Или воспользуйтесь поиском по форуму:
idaspin
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 45
28.07.2014, 11:51  [ТС]     Распарсить текстовый файл #10
Прост круто
Yandex
Объявления
28.07.2014, 11:51     Распарсить текстовый файл
Ответ Создать тему
Опции темы

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