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

Сколько выделить памяти, если заранее неизвестно количество вложенных классов - C++

Восстановить пароль Регистрация
 
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
05.10.2012, 21:26     Сколько выделить памяти, если заранее неизвестно количество вложенных классов #1
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#include <iostream>
#include <locale>
#include <fstream>
#include <string>
#include <vector>
#include <stdio.h>
#include <functional>
#include <windows.h>
#include <math.h>
using namespace std;
#define endline cout<<endl
#define FILENAME "C:\\TOKB\\test.txt" // ТУТ ЛОГИНЫ И ПАРОЛИ В каждой строке
/*
test.txt
tiva qwert 126
asdf zxcv 24
и тд
*/
#define DIRECTORY "C:\\TOKB\\"
#define OBJECT_TABLE "C:\\TOKB\\object.txt"
 
class ATable
{
public:
        class Object
        {
            public:
                string name;
                string content;
                vector <string> user_access;
                void output();
        };
    vector <string> login;
    vector <string> password;
    vector <int> access;
    vector <string> rights_sub;
    vector <string> rights_obj;
    static int count;
    ATable();
    void output();
    void save_file();
    void command(char *buf, int num);
    int check(char *buf, int k);
};
void ATable::Object::output()
{
    cout<<name<<"\t"<<content<<"\t";
    for(int i=0; i<user_access.size(); i++) cout<<user_access[i]<<" ";
    endline;
}
ATable::ATable()
{
        ifstream ifst(FILENAME);
 
        while(!ifst.eof())
        {
            string templog;
            string temppas;
            int tempacc;
 
            ifst >> templog >> temppas >> tempacc;
 
            login.push_back(templog);
            password.push_back(temppas);
            access.push_back(tempacc);
 
            count++;
        }
    }
void ATable::save_file()
{
    ofstream ofst(FILENAME);
    for (int i=0; i<login.size(); i++)
        ofst<<login[i]<<" "<<password[i]<<" "<<access[i]<<endl;
}
void ATable::command(char *buf, int num)
{
    char *_buf=new char [1024];
    int _lvl=0;
    ATable::Object *obj;
    if (strnicmp(buf, "new_sub", 7)==0)
    {
        cout<<"enter access level:\n";
        cin>>_lvl;
        if (_lvl<access[num]) {
            access.push_back(_lvl);
            cout<<"enter new login:\n";
            cin>>_buf;
            login.push_back(_buf);
            cout<<"enter new password:\n";
            memset(_buf,0,1024);
            cin>>_buf;
            password.push_back(_buf);
            save_file();
        }
        else cout<<"access denied: input lvl upper than yourself\n";
    }
    else if (strnicmp(buf, "new_obj", 7)==0)
    {
        obj=new ATable::Object;
        cout<<"Enter new object name:\n";
        cin>>_buf;
 
        obj->name=_buf;
        cout<<"Enter content:\n";
        cin.ignore(1,'\n');
        cin.getline(_buf, 50);
        obj->content=_buf;
        obj->user_access.push_back("rwx");
        obj->output();
    }
    else if (strnicmp(buf, "cls", 3)==0) {
             system("cls");
         }
    else if (strnicmp(buf, "help", 4)==0) {
                cout<<"NEW_OBJ - create new object\n";
                cout<<"NEW_SUB - create new subject\n";
                cout<<"OBJ_LIST - view object list\n";
                cout<<"CLS - clear screen\n";
                cout<<"HELP - K.O.\n";
         }
    else if (strnicmp(buf,"obj_list", 8)==0) {
            obj->output();
         }
}
int ATable::check(char *buf, int k)
{
    int c=0;
    if (k==0)
    {
            for(int i=0; i<count; i++)
            {
                if (strnicmp(buf, login[i].c_str(), 8)==0) return 1;
            }
    }
    if (k==1) {
        for(int i=0; i<count; i++)
        {
            if (strnicmp(buf, login[i].c_str(), 8)==0) return i;
        }
    }
}
void ATable::output()
{
    for(int i = 0; i < login.size(); i++)
    {
        cout << login[i] << " " << password[i] << " " << access[i];
        endline;
    }
}
int ATable::count=0;
//................................................................
int main(void)
{
    setlocale(0,"");
    ATable mytab;
    string hpwd, pwd;
    char *buf;
    buf=new char[1024];
    int err=1;
    int lvl=0, num;
    bool end=false;
    do //while(err==0 && end==false);
    {
        if(err==0){
            system ("cls");
            cout<<"Error!\nlogin: ";
        }
        else
        {
            cout<<"Hello!\nlogin: ";
        }
        cin>>buf;
        if (mytab.check(buf,0))
        {
            num=mytab.check(buf,1);
            cout<<"\npaswd: ";
            cin>>pwd;
            if (strnicmp(pwd.c_str(),mytab.password[num].c_str(), 16)==0) {
                cout<<"\nSuccess!\n";
                lvl=mytab.access[num];
                end=true;
                err=1;
            }
            else
            {
                end=false;
                err=0;
            }
        }
        else
        {
            err=0;
            end=false;
        }
    }
    while(err==0 && end==false);
    do  {
        cout<<"Enter command:\n";
        //memset(buf,0,1024);
        cin>>buf;
        if(strnicmp(buf,"exit",4)==0)
        {
            err=0;
            end=false;
        }
        else
        {
            mytab.command(buf, num);
            endline;
        }
        //mytab.save_file();
    }
    while (err==1 && end==true);
    endline;
    system("pause");
}
помогите реализовать пару проблемных моментов! пожалуйста!
первое:
есть класс ATable, в него вложен класс Object.
есть метод ATable::command, в котором объявляется указатель класса ATable::Object *obj;
память под указатель выделяется в if'e obj=new ATable::Object
проблема в том, что я не знаю, сколько новых объектов может создать пользователь, следовательно как объявить размер и каждый раз при вводе пользователем new_obj увеличивать количество хранимых в памяти объектов? для похожей задачи я использовал контейнер(когда не знал размер массива) но тут так не прокатывает ((((
и не работает вывод obj_list
C++
1
2
3
else if (strnicmp(buf,"obj_list", 8)==0) {
            obj->output();
         }
выводит бесконечно пробелы ну это наверное из-за кривого выделения выше

второе:
в мейне у меня определяется как бы точка входа пользователя. я зациклил выполнение команд при успешном входе, но как теперь сделать возможность "релога", т.е. смены пользователя, без потери данных и закрытия программы? я подумал, что достаточно будет авторизацию сделать через метод класса и так же зациклить. поможет?

заранее спасибо!!!!!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2012, 21:26     Сколько выделить памяти, если заранее неизвестно количество вложенных классов
Посмотрите здесь:

Определить количество классов эквивалентных столбцов данной прямоугольной матрицы. Столбцы считать эквивалентными, если равны множества их элементов. C++
C++ Определить количество классов эквивалентных строк данной прямоугольной матрицы. Строки считать эквивалентными, если равны суммы их элементов.
C++ Как вернуть обьект тип которого заранее неизвестно
C++ Выделить в памяти 1024 ячейки по 8 байт и вывести их адреса(МИНИ менеджер памяти))
C++ Произвольное количество вложенных циклов + рекурсия
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.10.2012, 22:15     Сколько выделить памяти, если заранее неизвестно количество вложенных классов #2
Цитата Сообщение от Tiva Посмотреть сообщение
но тут так не прокатывает
Почему не прокатывает? И зачем массивы char используете? Память не освобождаете. Если уж используете string, то используйте везде.
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
06.10.2012, 05:36  [ТС]     Сколько выделить памяти, если заранее неизвестно количество вложенных классов #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Почему не прокатывает? И зачем массивы char используете? Память не освобождаете. Если уж используете string, то используйте везде.
когда пишу

vector <ATable::Object> obj;
нифига не компилится. при всех последующих обращениях к obj.поле пишет, что "это поле не является членом ATable::Object
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.10.2012, 06:02     Сколько выделить памяти, если заранее неизвестно количество вложенных классов #4
И правильно пишет. Только дайте вектору другое имя, а то в comand() путаница будет (там obj занято). Если vector<Object> vecobj;, то к полям Object так нужно обращаться (если через индексы): vecobj[i].name . Если через итераторы, то так: vecobj.begin() -> name .
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
06.10.2012, 09:02  [ТС]     Сколько выделить памяти, если заранее неизвестно количество вложенных классов #5
Цитата Сообщение от alsav22 Посмотреть сообщение
И правильно пишет. Только дайте вектору другое имя, а то в comand() путаница будет (там obj занято). Если vector<Object> vecobj;, то к полям Object так нужно обращаться (если через индексы): vecobj[i].name . Если через итераторы, то так: vecobj.begin() -> name .
сделал так, но программа умирает

C++
1
2
3
4
5
6
7
8
9
10
cout<<"Enter new object name:\n";
        cin>>_buf;
 
        vec_obj.begin()->name.push_back(*_buf);
        cout<<"Enter content:\n";
        cin.ignore(1,'\n');
        cin.getline(_buf, 50);
        vec_obj.begin()->content.push_back(*_buf);
        vec_obj.begin()->user_access.push_back("rwx");
        vec_obj.begin()->output();
ввожу имя, жму ентер, и виснет
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.10.2012, 10:03     Сколько выделить памяти, если заранее неизвестно количество вложенных классов #6
Вектор пустой, поэтому и ошибка. Чтобы обращатся к элементам вектора, туда сначала нужно что-то поместить.
C++
1
2
obj=new ATable::Object;
vec_obj.push_back(*obj);
Только сначала нужно obj заполнить, а потом помещать в вектор.

Добавлено через 8 минут
Что-то наподобие:
C++
1
2
3
4
5
6
7
8
9
Object obj;
cout<<"Enter new object name:\n";
cin >> obj.name;
cout<<"Enter content:\n";
cin.ignore(1,'\n');
getline(cin, obj.content);
obj.user_access.push_back("rwx"); //зачем это поле сделано вектором?
obj.output();
vec_obj.push_back(obj);
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
06.10.2012, 17:34  [ТС]     Сколько выделить памяти, если заранее неизвестно количество вложенных классов #7
C++
1
obj.user_access.push_back("rwx");
спасибо, заработало

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

Добавлено через 26 минут
а как быть с выводом? чтоб не записывать объекты в файл, а вывести из памяти программы
пробовал и так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void ATable::Object::output(const Object&  obj)
{
    cout<<name<<"\t"<<content<<"\t";
    for(int i=0; i<Object::count_obj; i++) cout<<"user "<<i<<"\t"<<user_access[i]<<endl;
    endline;
}
void ATable::command(char *buf, int num)
{
    char *_buf=new char [1024];
    int _lvl=0;
    char _buf2[50];
    vector <Object> vec_obj;
    Object obj;
        ...
        if (strnicmp(buf,"obj_list", 8)==0) {
                vec_obj.begin()->output(obj);
         }
}
пробовал и так:
C++
1
2
3
4
5
6
7
void ATable::Object::output(); // без параметров
...
if (strnicmp(buf,"obj_list", 8)==0) {
   vec_obj.begin()->output();// и так
// ИЛИ
   obj.output(); // так. но тут программа хоть не крашится, а просто ничего не выводит. я подумал опять пустой вектор, и сделал как выше. крашится программа :(
     }
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.10.2012, 19:31     Сколько выделить памяти, если заранее неизвестно количество вложенных классов #8
Если через индексы:
C++
1
2
3
4
else if (strnicmp(buf,"obj_list", 8)==0) {
            for (int i = 0; i < vec_obj.size(); i++)
                vec_obj[i].output();    
            }
Если через итераторы:
C++
1
2
3
4
else if (strnicmp(buf,"obj_list", 8)==0) {
            for (auto i = vec_obj.begin(); i != vec_obj.end(); i++)
                i -> output();  
            }
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
12.10.2012, 13:23  [ТС]     Сколько выделить памяти, если заранее неизвестно количество вложенных классов #9
1ый вариант ничего не выводит.
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
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#include <iostream>
#include <locale>
#include <fstream>
#include <string>
#include <vector>
#include <stdio.h>
#include <functional>
#include <windows.h>
#include <math.h>
using namespace std;
#define endline cout<<endl
#define FILENAME "C:\\TOKB\\test.txt"
#define DIRECTORY "C:\\TOKB\\"
#define OBJECT_TABLE "C:\\TOKB\\object.txt"
 
class ATable
{
public:
        class Object
        {
            public:
                string name;
                string content;
                vector <string> user_access;
                static int count_obj;
                void output();
        };
    vector <string> login;
    vector <string> password;
    vector <int> access;
    static int count;
    ATable();
    void output();
    void save_file();
    void command(char *buf, int num);
    int check(char *buf, int k);
};
void ATable::Object::output()
{
    cout<<name<<"\t"<<content<<"\t";
    for(int i=0; i<Object::count_obj; i++) cout<<user_access[i]<<" ";
    endline;
}
ATable::ATable()
{
        ifstream ifst(FILENAME);
 
        while(!ifst.eof())
        {
            string templog;
            string temppas;
            int tempacc;
 
            ifst >> templog >> temppas >> tempacc;
 
            login.push_back(templog);
            password.push_back(temppas);
            access.push_back(tempacc);
 
            count++;
        }
    }
void ATable::save_file()
{
    ofstream ofst(FILENAME);
    for (int i=0; i<login.size(); i++)
        ofst<<login[i]<<" "<<password[i]<<" "<<access[i]<<endl;
}
void ATable::command(char *buf, int num)
{
    char *_buf=new char [1024];
    int _lvl=0;
    char _buf2[50];
    vector <Object> vec_obj;
    Object *obj;
    if (strnicmp(buf, "new_sub", 7)==0)
    {
        cout<<"enter access level:\n";
        cin>>_lvl;
        if (_lvl<access[num])
        {
            access.push_back(_lvl);
            cout<<"enter new login:\n";
            cin>>_buf;
            login.push_back(_buf);
            cout<<"enter new password:\n";
            memset(_buf,0,1024);
            cin>>_buf;
            password.push_back(_buf);
            save_file();
        }
        else cout<<"access denied: input lvl upper than yourself\n";
    }
    else if (strnicmp(buf, "new_obj", 7)==0)
    {
        obj=new Object[Object::count_obj+1];
        cout<<"Enter new object name:\n";
        cin >> obj->name;
        cout<<"Enter content:\n";
        cin.ignore(1,'\n');
        getline(cin, obj->content);
        obj->user_access.push_back("rwx"); //зачем это поле сделано вектором?
        //obj.output();
        vec_obj.push_back(*obj);
        Object::count_obj++;
 
    }
    else if (strnicmp(buf,"obj_list", 8)==0) {
            for (int i = 0; i < vec_obj.size(); i++)
                vec_obj[i].output();    
            }
    else if (strnicmp(buf, "cls", 3)==0) {
             system("cls");
         }
    else if (strnicmp(buf, "help", 4)==0) {
                cout<<"NEW_OBJ - create new object\n";
                cout<<"NEW_SUB - create new subject\n";
                cout<<"OBJ_LIST - view object list\n";
                cout<<"CLS - clear screen\n";
                cout<<"HELP - K.O.\n";
         }
}
int ATable::check(char *buf, int k)
{
    int c=0;
    if (k==0)
    {
            for(int i=0; i<count; i++)
            {
                if (strnicmp(buf, login[i].c_str(), 8)==0) return 1;
            }
    }
    if (k==1) {
        for(int i=0; i<count; i++)
        {
            if (strnicmp(buf, login[i].c_str(), 8)==0) return i;
        }
    }
}
void ATable::output()
{
    for(int i = 0; i < count; i++)
    {
        cout << login[i] << " " << password[i] << " " << access[i];
        endline;
    }
}
int ATable::count=0;
int ATable::Object::count_obj=0;
//................................................................
int main(void)
{
    setlocale(0,"");
    ATable mytab;
    string hpwd, pwd;
    char *buf;
    buf=new char[1024];
    int err=1;
    int lvl=0, num;
    bool end=false;
    do //while(err==0 && end==false);
    {
        if(err==0){
            system ("cls");
            cout<<"Error!\nlogin: ";
        }
        else
        {
            cout<<"Hello!\nlogin: ";
        }
        cin>>buf;
        if (mytab.check(buf,0))
        {
            num=mytab.check(buf,1);
            cout<<"\npaswd: ";
            cin>>pwd;
            if (strnicmp(pwd.c_str(),mytab.password[num].c_str(), 16)==0) {
                cout<<"\nSuccess!\n";
                lvl=mytab.access[num];
                end=true;
                err=1;
            }
            else
            {
                end=false;
                err=0;
            }
        }
        else
        {
            err=0;
            end=false;
        }
    }
    while(err==0 && end==false);
    do  {
        cout<<"Enter command:\n";
        //memset(buf,0,1024);
        cin>>buf;
        if(strnicmp(buf,"exit",4)==0)
        {
            err=0;
            end=false;
        }
        else
        {
            mytab.command(buf, num);
            endline;
        }
        //mytab.save_file();
    }
    while (err==1 && end==true);
    endline;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2012, 08:39     Сколько выделить памяти, если заранее неизвестно количество вложенных классов
Еще ссылки по теме:

C++ как захватить динамически память, не зная заранее какое количество памяти надо?
Даны действительные числа a1, ., an. (n>=2 и заранее неизвестно). Выяснить, имеются ли среди чисел a1, ., C++
C++ Даны действительные числа a1, ., a2n (n>=2 и заранее неизвестно). Получить: (a1- a2n)(a3- a2n-2)(a5- a2n-4)

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.10.2012, 08:39     Сколько выделить памяти, если заранее неизвестно количество вложенных классов #10
Вот это объявить в классе ATable (из command убрать):
C++
1
vector <Object> vec_obj;
. Сделать просто:
C++
1
string user_access;
Вызывать:
C++
1
vec_obj[i].Object::output();
Убрать static int count_obj;(не нужен, вектор знает свой размер). Объекты так создавать:
C++
1
Object obj;
Код
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
class ATable
{
public:
        class Object
        {
            public:
                string name;
                string content;
                string user_access;
                void output();
        };
    
    vector <Object> vec_obj;
    vector <string> login;
    vector <string> password;
    vector <int> access;
    static int count;
    ATable();
    void output();
    void save_file();
    void command(char *buf, int num);
    int check(char *buf, int k);
};
 
void ATable::Object::output()
{
    cout<<name<<"\t"<<content<<"\t" << user_access <<" ";
    endline;
}
 
ATable::ATable()
{
        ifstream ifst(FILENAME);
 
        while(!ifst.eof())
        {
            string templog;
            string temppas;
            int tempacc;
 
            ifst >> templog >> temppas >> tempacc;
 
            login.push_back(templog);
            password.push_back(temppas);
            access.push_back(tempacc);
 
            count++;
        }
    }
 
void ATable::save_file()
{
    ofstream ofst(FILENAME);
    for (int i=0; i<login.size(); i++)
        ofst<<login[i]<<" "<<password[i]<<" "<<access[i]<<endl;
}
 
void ATable::command(char *buf, int num)
{
    char *_buf=new char [1024];
    int _lvl=0;
    char _buf2[50];
    
    //Object *obj;
    if (strnicmp(buf, "new_sub", 7)==0)
    {
        cout<<"enter access level:\n";
        cin>>_lvl;
        if (_lvl<access[num])
        {
            access.push_back(_lvl);
            cout<<"enter new login:\n";
            cin>>_buf;
            login.push_back(_buf);
            cout<<"enter new password:\n";
            memset(_buf,0,1024);
            cin>>_buf;
            password.push_back(_buf);
            save_file();
        }
        else cout<<"access denied: input lvl upper than yourself\n";
    }
    else if (strnicmp(buf, "new_obj", 7)==0)
    {
        Object obj;
        cout<<"Enter new object name:\n";
        cin >> obj.name;
        cout<<"Enter content:\n";
        cin.ignore(1,'\n');
        getline(cin, obj.content);
        obj.user_access = "rwx"; 
        
        vec_obj.push_back(*obj);
        
 
    }
    else if (strnicmp(buf,"obj_list", 8)==0) {
            for (int i = 0; i < vec_obj.size(); i++)
                vec_obj[i].Object::output();    
            }
    else if (strnicmp(buf, "cls", 3)==0) {
             system("cls");
         }
    else if (strnicmp(buf, "help", 4)==0) {
                cout<<"NEW_OBJ - create new object\n";
                cout<<"NEW_SUB - create new subject\n";
                cout<<"OBJ_LIST - view object list\n";
                cout<<"CLS - clear screen\n";
                cout<<"HELP - K.O.\n";
         }
}
 
int ATable::check(char *buf, int k)
{
    int c=0;
    if (k==0)
    {
            for(int i=0; i<count; i++)
            {
                if (strnicmp(buf, login[i].c_str(), 8)==0) return 1;
            }
    }
    if (k==1) {
        for(int i=0; i<count; i++)
        {
            if (strnicmp(buf, login[i].c_str(), 8)==0) return i;
        }
    }
}
 
void ATable::output()
{
    for(int i = 0; i < count; i++)
    {
        cout << login[i] << " " << password[i] << " " << access[i];
        endline;
    }
}
 
int ATable::count=0;
 
//................................................................
 
int main(void)
{
    setlocale(0,"");
    ATable mytab;
    string hpwd, pwd;
    char *buf;
    buf=new char[1024];
    int err=1;
    int lvl=0, num;
    bool end=false;
    do //while(err==0 && end==false);
    {
        if(err==0){
            system ("cls");
            cout<<"Error!\nlogin: ";
        }
        else
        {
            cout<<"Hello!\nlogin: ";
        }
        cin>>buf;
        if (mytab.check(buf,0))
        {
            num=mytab.check(buf,1);
            cout<<"\npaswd: ";
            cin>>pwd;
            if (strnicmp(pwd.c_str(),mytab.password[num].c_str(), 16)==0) {
                cout<<"\nSuccess!\n";
                lvl=mytab.access[num];
                end=true;
                err=1;
            }
            else
            {
                end=false;
                err=0;
            }
        }
        else
        {
            err=0;
            end=false;
        }
    }
    while(err==0 && end==false);
    do  {
        cout<<"Enter command:\n";
        //memset(buf,0,1024);
        cin>>buf;
        if(strnicmp(buf,"exit",4)==0)
        {
            err=0;
            end=false;
        }
        else
        {
            mytab.command(buf, num);
            endline;
        }
        //mytab.save_file();
    }
    while (err==1 && end==true);
    endline;
    
    system("pause");
    return 0;
}


Объекты должны в файл записываться? У вас в коде нет освобожденя памяти. Зачем массивы char используете, а не string?

Добавлено через 1 час 38 минут
С исправлениями и дополнениями. Убрал new, массивы char заменил на string. Сделал еще запись в файл объектов (команда "obj_save") и загрузку объектов из файла (происходит после удачного ввода пароля). Сделал выход, из цикла ввода команд, при вводе EOF(Ctrl + Z). Не понятно с командой new_sub, с уровнем доступа. По коду плучается, что создавать может тот, у кого доступ, в числовом выражении, меньше, чем у того, под чьим логином был вход (if (_lvl < access[num]). Это так должно быть? Или нужно наоборот: if (_lvl > access[num]) ? Ещё ATable::output() (вывод паролей/логинов/доступа) в коде не используется. Если не нужен, можно убрать. Или использовать.

Код
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
// добавить
#include <cctype> // для isgraph()
 
class ATable
{
public:
        class Object
        {
            public:
                string name;
                string content;
                string user_access;
                void output();
        };
    
    vector <Object> vec_obj;
    vector <string> login;
    vector <string> password;
    vector <int> access;
    static int count;
    ATable();
    void output();
    void save_file();
    void save_object();
    int load_object();
    void command(string, int num);
    int check(string buf, int k);
};
 
void ATable::Object::output()
{
    cout << name << "\t" << content << "\t" << user_access;
    endline;
}
 
ATable::ATable()
{
        ifstream ifst(FILENAME);
 
        while(!ifst.eof())
        {
            string templog;
            string temppas;
            int tempacc;
 
            ifst >> templog >> temppas >> tempacc;
            
            if (templog.empty()) break;
            login.push_back(templog);
            password.push_back(temppas);
            access.push_back(tempacc);
            
            count++;
        }
}
 
void ATable::save_file()
{
    ofstream ofst(FILENAME);
    for (int i = 0; i < count; i++)
         ofst << login[i] << " " << password[i] << " " << access[i] << endl;
}
 
void ATable::save_object()
{
    ofstream ofst(OBJECT_TABLE);
    for (int i = 0; i < vec_obj.size(); i++)
        ofst << vec_obj[i].name << "\t" << vec_obj[i].content << "\t" << vec_obj[i].user_access << endl;
        
}
 
int ATable::load_object()
{
    ifstream ifst(OBJECT_TABLE);
    if (!ifst.is_open()) return 1;
    
    while(!ifst.eof())
    {
        Object obj;
        string temp;
        ifst >> temp;
        if (temp.empty()) break;
        obj.name = temp;
        while (!isgraph((unsigned char)ifst.get()));
        ifst.seekg(-1, ios::cur);  
        getline(ifst, obj.content, '\t');
        ifst >> obj.user_access;
        vec_obj.push_back(obj);
    }
 
    return 0;
}
 
void ATable::command(string buf, int num)
{
    string _buf;
    int _lvl = 0;
    
    if (buf == "new_sub")
    {
        cout << "enter access level:\n";
        cin >> _lvl;
        if (_lvl < access[num])
        {
            access.push_back(_lvl);
            cout << "enter new login:\n";
            cin >> _buf;
            login.push_back(_buf);
            cout << "enter new password:\n";
            cin >> _buf;
            password.push_back(_buf);
            count++;
            
            save_file();
        }
        else cout<<"access denied: input lvl upper than yourself\n";
    }
    
    else if (buf == "new_obj")
    {
        Object obj;
        cout << "Enter new object name:\n";
        cin >> obj.name;
        cout << "Enter content:\n";
        cin.get();
        getline(cin, obj.content);
        obj.user_access = "rwx"; 
        
        vec_obj.push_back(obj);
        
    }
    
    else if (buf == "obj_list") 
    {
          if (vec_obj.empty()) cout << "No objects\n";
          else for (int i = 0; i < vec_obj.size(); i++)
                    vec_obj[i].Object::output();
    }
    
    else if (buf == "obj_save") save_object();
    
    else if (buf == "cls")  system("cls");
    
    else if (buf == "help") 
         {
                cout << "NEW_OBJ - create new object\n";
                cout << "NEW_SUB - create new subject\n";
                cout << "OBJ_LIST - view object list\n";
                cout << "OBJ_SAVE - save object to file\n";
                cout << "CLS - clear screen\n";
                cout<<"HELP - K.O.\n";
         }
}
 
int ATable::check(string log, int k)
{
    int c = 0;
    if (k == 0)
    {
        for(int i = 0; i < count; i++)
            if (log == login[i]) return 1;
        return 0;
    }
    if (k == 1) 
    {
        for(int i = 0; i < count; i++)
            if (log == login[i]) return i;
    }   return 0;
}
 
void ATable::output()
{
    for(int i = 0; i < count; i++)
    {
        cout << login[i] << " " << password[i] << " " << access[i];
        endline;
    }
}
 
 
int ATable::count = 0;
 
//................................................................
 
int main(void)
{
    setlocale(0, "");
    
    ATable mytab;
    string log, pwd;
    string buf = "";
    int err = 1;
    int lvl = 0, num;
    bool end = false;
    
    do //while(err==0 && end==false);
    {
        if(err == 0)
        {
            system ("cls");
            cout<<"Error!\nlogin: ";
        }
        else
        {
            cout<<"Hello!\nlogin: ";
        }
        
        cin >> log;
        
        if (mytab.check(log, 0))
        {
            num = mytab.check(log, 1);
            cout << "\npaswd: ";
            cin >> pwd;
            
            if (pwd == mytab.password[num]) 
            {
                cout<<"\nSuccess!\n";
                lvl = mytab.access[num];
                end = true;
                err = 1;
 
// загрузка объектов из файла. Если файл ещё не существует, вывод сообщения.
                if (mytab.load_object()) cout << "\nFile with objects does not exist\n\n";
            }
            else
            {
                end = false;
                err = 0;
            }
        }
        else
        {
            err = 0;
            end = false;
        }
    } while(err == 0 && end == false);
    
    do  
    {
         cout << "Enter command (Ctrl + Z - exit):\n";
         cin >> buf;
         
         if (!cin) break; // при вводе Ctrl + Z - выход
         
         if(buf == "exit")
         {
            err = 0;
            end = false;
         }
         else
         {
            mytab.command(buf, num);
            endline;
         }
         //mytab.save_file();
    }
    while (err == 1 && end == true);
    
    endline;
    
    system("pause");
    return 0;
}
Yandex
Объявления
13.10.2012, 08:39     Сколько выделить памяти, если заранее неизвестно количество вложенных классов
Ответ Создать тему
Опции темы

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