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

Работа с БД. Файл с самой БД - C++

Восстановить пароль Регистрация
 
Student789
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 2
20.01.2014, 16:45     Работа с БД. Файл с самой БД #1
Всем здравствуйте!

Есть прога для работы с БД, делал не я, пытаюсь в ней разобраться. Встал вопрос- прога требует файл, в котором хранится сама БД. Что должно быть в файле ( по идее файл текстовый) ясно и понятно.

Вопрос: а где должен лежать сам файл и какого он должен быть формата? и вообще прога требует название файла или путь к нему? формат файла нужно указывать?

Сам пробовал создавать текстовый файл и пихал его во все папки проги. Безрезультатно- при введении имени/пути к файлу в окне консоли выдает Error. В части кода где я предполагаю открытие файла разобраться вообще не получается.

Заранее благодарю за помощь!

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
//БД - данные кинолога. Поля записей: идентификационный номер собаки, кличка, порода, ФИО хозяина, идентификационный номер отца, идентификационный номер матери.
//Пункты меню:
//- данные по всем собакам;
//- все собаки выбранного хозяина;
//- родословная выбранной собаки (2 поколения)
 
#include <fstream>
#include <string>
#include <iostream>
#include "class.h"
using namespace std;
 
int main()
{
    databaseDogs dog;
    int id;
    char name[100];
    char way[100];
    char flName[100];
    int selection;
    do
    {
// так полагаю тут идет кусок кода связанного с файлом с самой БД
        strcpy_s(way, ".txt");
        cout << "Name file: ";
        cin >> flName;
        strcat_s(way, flName);
        if(!dog.openDatabase(way))
        {
            cout << "Error" << endl;
            continue;
        }
        else
            break;
    }while(1);
    do
    {
        cout << "1 - to output all list\n" 
             << "2 - to bring dogs on cynologist \n" 
             << "3 - the family tree of chosen dog\n"
             << "4 - to remove record\n"
             << "5 - to add record\n"
             << "0 - Exit\n" << endl;
 
        cin >> selection;
        cin.clear();
        cin.sync();
        switch (selection)
        {
        case 1:
            dog.showAll();
            break;
        case 2:
             cout << "Enter a surname of the cynologist:";
            cin.ignore(cin.rdbuf()->in_avail(), '\n');
            cin.get(name, MAX_STRING_SIZE);
            dog.showOwner(name);; 
            break;
        case 3:
           cout << "Enter a nickname of a dog:";
            cin.ignore(cin.rdbuf()->in_avail(), '\n');
            cin.get(name, MAX_STRING_SIZE);
            dog.showfamilytree(name);
            break;
        case 4:
            cout << "Enter id of dog: ";
            cin >> id;
            dog.removeDog(id);
            break;
        case 5:
            dog.addDog();
            break;
        default:
            if(selection)
            cout << "is not right \n\n";
            break;
        }
    }while(selection);
    return 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
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
265
266
267
268
269
270
271
272
#include "class.h"
databaseDogs::~databaseDogs()
{
    if(openFile)
    {
        writeFile();
        database.close();
    }
    dogs *current;
    current = first;
    while(first)
    {
        first = first->next;
        delete current;
        current = first;
    }
}
databaseDogs::dogs* databaseDogs::findDog(int id)       
{
    dogs *current = first;
    while (current)
    {
        if(id == current->idDog)
            return current;
        current = current->next;
    }
}
 
// вот тут тоже вроде кусок кода с открытием файла с БД
bool databaseDogs::openDatabase(char* way)
{
    if(openFile)
    {
        return 0;
    }
 
    database.open(way, ios::in);
    if (!database)
        return false;
    openFile = true;
    strcpy_s(fileName, way);
 
    while(!database.eof())
    {
        
        dogs *newDog = new dogs;
        database >> newDog->idDog;
        database >> newDog->nicknameDog;
        database >> newDog->breedDog;
        database >> newDog->FamC;
        database >> newDog->NameC;
        database >> newDog->OtchC;
        database >> newDog->idFather;
        database >> newDog->idMother;
        if(!last)
        {
            first = newDog;
            last = newDog;
            newDog->next = 0;
        }
        else
        {
            last->next = newDog;
            last = newDog;
            last->next = 0;
        }
        dogCount ++;
    }
    return true;
}
void databaseDogs::showAll()
{
    dogs *current = first;
    while(current)
    {
        cout << "id" << current->idDog << ' ' 
        << "Breed: " << current->breedDog << ' '
        << "Nickname:" << current->nicknameDog << ' ' 
        << "Owner:" << current->FamC <<' '
        << "" << current->NameC <<' '
        << "" << current->OtchC << endl;
        current = current->next;
    }
    cout << endl;
}
void databaseDogs::showOwner (char* name)
{
    bool check = false;     //есть ли вообще хозяин
    dogs *current = first;
    while (current)
    {
        if(((string)(current->FamC)).find(name) != -1)
        {
            cout << current->FamC << " - " << current->nicknameDog << endl;
            check = true;
        }
        else
            if(((string)(current->NameC)).find(name) != -1)
        {
            cout << current->NameC << " - " << current->nicknameDog << endl;
            check = true;
        }
        else
            if(((string)(current->OtchC)).find(name) != -1)
        {
            cout << current->OtchC << " - " << current->nicknameDog << endl;
            check = true;
        }
 
        current = current->next;
    }
    if (!check)
        cout << "It isn't found any cynologist with such name" << endl;//Не найдено ни одного кинолога с таким именем
    cout << endl;
}
 
 
 
bool databaseDogs::showfamilytree(char* name)
{
    dogs *current = first;
    dogs *parent;
 
    while (current)
    {
        if(((string)(current->nicknameDog)).find(name) != -1)
        {
            cout << "Dog: " << current->nicknameDog << endl;
            if(current->idFather == 0 && current->idMother == 0)
            {
                cout << "The father and mother aren't found in a database" << endl;
                return 1;
            }
            else
            {
                parent = findDog(current->idFather);
                cout << "Father: " << parent->nicknameDog << endl;
                if(parent->idFather == 0 && parent->idMother == 0 )
                {
                    cout << "Parents of the father aren't found in the database" << endl;
                }
                else
                    cout << "The grandfather on the father: " << (findDog(parent->idFather))->nicknameDog << endl << "The grandmother on the father: " << (findDog(parent->idMother))->nicknameDog << endl;
                parent = findDog(current->idMother);
                cout << "Mother: " << parent->nicknameDog << endl;
                if(parent->idFather == 0 && parent->idMother == 0)
                {
                    cout << "Parents of the mother aren't found in the database" << endl;
                    return 1;
                }
                else
                    cout << "The grandfather on the mother: " << (findDog(parent->idFather))->nicknameDog << endl << "The grandmother on the mother: " << (findDog(parent->idMother))->nicknameDog << endl;
            }
        }
        current = current->next;
    }
}
void databaseDogs::removeDog(int id)
{
    
    dogs* current = first;
    dogs* temp;
 
 
 
    while(current->next)
    {
        if((current->next->idDog) == id)
        {
            temp = current->next;
            if(current->next == last)
            {
                last = current;
                current->next = temp->next;
                delete(temp);
                dogCount--;
                break;
            }
            current->next = temp->next;
            delete(temp);
            dogCount--;
        }
    current = current->next;
    }
    if(first->idDog == id)
        {
            temp = first;
            first = first->next;
            delete(temp);
            dogCount--;
        }
}
void databaseDogs::addDog()
{
    dogs* current = first;
    int maxId = 0;
    while(current)
    {
        if(current->idDog > maxId)
            maxId = current->idDog;
        current = current->next;
    }
    maxId++;
    dogs* newDog = new dogs;
    newDog->idDog = maxId;
    cout << "Enter nickname: ";
    cin >> newDog->nicknameDog;
    cout << endl << "Enter breed: ";
    cin >> newDog->breedDog;
    cout << endl << "Enter a surname of the owner: ";
    cin.ignore(cin.rdbuf()->in_avail(), '\n');
    cin.get(newDog->FamC, MAX_STRING_SIZE);
    cout << endl << "Enter a name of the owner: ";
    cin.ignore(cin.rdbuf()->in_avail(), '\n');
    cin.get(newDog->NameC, MAX_STRING_SIZE);
    cout << endl << "Enter a otchestvo of the owner: ";
    cin.ignore(cin.rdbuf()->in_avail(), '\n');
    cin.get(newDog->OtchC, MAX_STRING_SIZE);
    cout << endl << "Enter id of father: ";
    cin >> newDog->idFather;
    cout << endl << "Enter id of mother: ";
    cin >> newDog->idMother;
    if(!last)
        {
            first = newDog;
            last = newDog;
            newDog->next = NULL;
        }
        else
        {
            last->next = newDog;
            last = newDog;
            last->next = NULL;
        }
    dogCount ++;
    cout << "Record is successfully added" << endl;//Запись успешно добавлена
}
 
 
void databaseDogs::writeFile()
{
    if(openFile)
    {
        database.close();
 
        database.open(fileName, ios::out);
        dogs *current = first->next;
        database << first->idDog << ' '
            << first->nicknameDog << ' '
            << first->breedDog << ' '
            << first->FamC << ' '
            << first->NameC << ' '
            << first->OtchC << ' '
            << first->idFather << ' '
            << first->idMother;
        while(current)
        {
            database << '\n' << current->idDog << ' '
            << current->nicknameDog << ' '
            << current->breedDog << ' '
            << current->FamC << ' '
            << current->NameC << ' '
            << current->OtchC << ' '
            << current->idFather << ' '
            << current->idMother;
 
            current = current->next;
        }
        database.close();
        database.open(fileName, ios::in);
    }
}
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
#include <fstream>
#include <string>
#include <iostream>
const int MAX_STRING_SIZE = 100;
using namespace std;
class databaseDogs
{
    private:
    struct dogs
    {
        int idDog;                  
        char nicknameDog[100];           
        char breedDog[100];         
        char FamC[100]; 
        char NameC[100];
        char OtchC[100];    
        int idFather;
        int idMother;
        dogs *next;
    };
    fstream database;
    char fileName[100];
    dogs *first;
    dogs *last;
    int dogCount;
    bool openFile;
 
    public:
    databaseDogs() : first(NULL), last(NULL), dogCount(0), openFile(false) {}
    ~databaseDogs(); 
    bool openDatabase(char* way); 
    void showAll();         
    void showOwner(char* name);
    bool showfamilytree(char* name); 
    void removeDog(int id); 
    void addDog();          
    void writeFile();       
    dogs* findDog(int id);      
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,196
Завершенные тесты: 1
20.01.2014, 16:57     Работа с БД. Файл с самой БД #2
C++
1
        strcat_s(flName,way) ;
неправильно был написан порядок операндов.
1-й - в хвост чего прикрепляем,
2-й - что прикрепляем.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.01.2014, 17:03     Работа с БД. Файл с самой БД #3
Цитата Сообщение от Student789 Посмотреть сообщение
а где должен лежать сам файл и какого он должен быть формата?
судя по коду в текущей папке. Если запускаете напрямую, то в папке с программой.
Если через среду разработки, то возможны варианты.
Цитата Сообщение от Student789 Посмотреть сообщение
и вообще прога требует название файла или путь к нему?
одно другому не мешает. Можете задать полный путь кстати.
Цитата Сообщение от Student789 Посмотреть сообщение
формат файла нужно указывать?
что Вы подразумеваете под форматом?

Добавлено через 3 минуты
zss, не помешает дополнить, что это про 27 строку из main, а не про 41 из databaseDogs.cpp
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,196
Завершенные тесты: 1
20.01.2014, 17:09     Работа с БД. Файл с самой БД #4
Цитата Сообщение от Tulosba Посмотреть сообщение
а не про 41 из databaseDogs.cpp
в 41-й используется strcpy_s, а не strcat_s.

Добавлено через 2 минуты
Кстати, совершенно непонятно, зачем там эта строка (41-я)?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.01.2014, 17:16     Работа с БД. Файл с самой БД #5
Цитата Сообщение от zss Посмотреть сообщение
Кстати, совершенно непонятно, зачем там эта строка (41-я)?
Всё понятно. Сохранение в поле класса.
Student789
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 2
20.01.2014, 17:48  [ТС]     Работа с БД. Файл с самой БД #6
Поменял местами операнды, как выдавала прога ошибку, так ничего не изменилось((
Файл опять клал в папку проги.
Под форматом файла я имел ввиду какого он должен быть формата и надо ли его указывать: 1.txt ili prosto 1 писать при запросе имени файла ну или вообще мб (чего уже только не предполагал) прога хочет экселевский или черт знает какой файл.

Ещё: в старом варианте main'a в 24 строке было так:

C++
1
 strcpy_s(way, ".//da//");
а не

C++
1
strcpy_s(way, ".txt");
как я сейчас выложил.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2014, 17:56     Работа с БД. Файл с самой БД
Еще ссылки по теме:

Возможно ли как-то сокрыть реализации стратегий в самой библиотеке, то есть вынести в cpp-файл? C++
C++ Не перезаписывается файл. Работа с fstream
C++ Запись в файл работа с текстом меню и файлы

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.01.2014, 17:56     Работа с БД. Файл с самой БД #7
Student789, отладчиком пользоваться умеете? Запускайте и по шагам всё станет ясно.
Yandex
Объявления
20.01.2014, 17:56     Работа с БД. Файл с самой БД
Ответ Создать тему
Опции темы

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