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

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

Войти
Регистрация
Восстановить пароль
 
Student789
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 2
#1

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

20.01.2014, 16:45. Просмотров 256. Ответов 6
Метки нет (Все метки)

Всем здравствуйте!

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

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

Сам пробовал создавать текстовый файл и пихал его во все папки проги. Безрезультатно- при введении имени/пути к файлу в окне консоли выдает 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);      
};
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2014, 16:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с БД. Файл с самой БД (C++):

Как удалить файл программы с винчестера самой программой? - C++
Мне нужно сделать это под Виндоус. Удалить файл программы когда она же и запущена. Система блокирует доступ к файлу на удаление.

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

Создать текстовый файл in.txt, куда записать несколько строк. Найти номер самой короткой строки - C++
1.Создать текстовый файл in.txt, куда записать несколько строк. Найти номер самой короткой строки. Буду благодарен ..

дан файл f. напечатать в файл g длину самой длинной строки - Visual Basic
дан файл f. напечатать в файл g длину самой длинной строки.

Как получить адрес самой левой и самой правой ячейки в Excel? - VBA
Если выделено несколько ячеек, все по одной строке, как получить адрес и значение самой левой из них и самой правой? Другая задача:...

Найти путь от самой верхней до самой нижней ячейки квадрата - C (СИ)
Здравствуйте помогите пожалуйста с таким заданием на СИ: есть поле 20х20 надо посредством массива рандомом (каждый раз новый) найти путь...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
20.01.2014, 16:57 #2
C++
1
        strcat_s(flName,way) ;
неправильно был написан порядок операндов.
1-й - в хвост чего прикрепляем,
2-й - что прикрепляем.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.01.2014, 17:03 #3
Цитата Сообщение от Student789 Посмотреть сообщение
а где должен лежать сам файл и какого он должен быть формата?
судя по коду в текущей папке. Если запускаете напрямую, то в папке с программой.
Если через среду разработки, то возможны варианты.
Цитата Сообщение от Student789 Посмотреть сообщение
и вообще прога требует название файла или путь к нему?
одно другому не мешает. Можете задать полный путь кстати.
Цитата Сообщение от Student789 Посмотреть сообщение
формат файла нужно указывать?
что Вы подразумеваете под форматом?

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

Добавлено через 2 минуты
Кстати, совершенно непонятно, зачем там эта строка (41-я)?
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.01.2014, 17:16 #5
Цитата Сообщение от zss Посмотреть сообщение
Кстати, совершенно непонятно, зачем там эта строка (41-я)?
Всё понятно. Сохранение в поле класса.
1
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");
как я сейчас выложил.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.01.2014, 17:56 #7
Student789, отладчиком пользоваться умеете? Запускайте и по шагам всё станет ясно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2014, 17:56
Привет! Вот еще темы с ответами:

Вывести данные о квартирах с самой большой площадью и самой маленькой - C (СИ)
Задание 5: Структуры Дана информация о пяти квартирах. Запись имеет вид: фамилия владельца, площадь, число комнат, этаж. Вывести...

Посчитать сумму самой крайней правой стороны и самой нижний в заданной матрице - Pascal
Дан двухмерный массив посчитать сумму самой крайней правой стороны и самой нижний если сумма элементов двух сторон четное число поменять...

Сумма двух цифр введенного числа: самой большой цифры и самой маленькой - Free Pascal
Написать процедуру minmax (free pascal) которая получает в качестве параметра целое положительное число (не более чем 32768) и выводит на...

Определить расстояние между самой дальней и самой близкой точкой по отношению к началу координат. - Turbo Pascal
С помощью действительной матрицы 2 на n на плоскости задано n точек, так, что Х1,j и Х2,j координаты j-ой точки. Определить расстояние...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.01.2014, 17:56
Ответ Создать тему
Опции темы

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