Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Простейшая база данных


Автор: suse 9.3.2009, 22:39
А как на основе данной программы сделать простейшую базу данных?
Код

#include <stdio.h>
struct Node
 {
     int d;
     Node *p;
 };
int main()
{
    Node *pv=new Node;
    pv->d=1;
    pv->p=0;
    Node  *pbeg=pv;
     Node  *pend=pv;
     for(int i=2; i<6; i++)
    {            
          Node *pv=new Node;
        
        pv->d=i;        
        pend->p=pv;
        pend=pv;        
    }
     pend->p = 0;
     while(pbeg)
        {
            pv=pbeg;
            printf ("%d\n",pbeg->d);
            pbeg=pbeg->p;
            delete pv;
       }
return 0;
}

Ну например в текстовом файле записаны Имя Фамилия и Должность. Требуется прочитать этот 
текстовой файл строчка за строчкой, создать копии всех записей и дописать их в файл.
Должно получиться что то вроде:
Иванов Иван полковник
Петров Петр майор
Константинов Константин сержант
------------------------------------
Иванов Иван полковник
Петров Петр майор
Константинов Константин сержант 

Автор: Anikmar 9.3.2009, 23:20
Эта программа умеет делать только односвязные списки. 
Расширяйте структуру Node - для хранения информации об одной записи БД, затем добавляйте методы чтения/записи в файл.

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

Если хотите еще и немного нормализацию поизучать - звания можно в отдельный списочек занести, но думаю в рамках текущей задачи это не нужно.


Автор: Dmi3ev 9.3.2009, 23:39
suse, может быть полезным...
http://forum.vingrad.ru/forum/topic-250268.html

Автор: mrbrooks 10.3.2009, 10:13
suse, предупреждаю сразу - со своей поделкой замучаешься. Используй готовые решения.

Автор: zim22 10.3.2009, 10:23
Цитата(mrbrooks @  10.3.2009,  10:13 Найти цитируемый пост)
со своей поделкой замучаешься

зато поумнеет

Автор: mrbrooks 10.3.2009, 10:26
Цитата(zim22 @  10.3.2009,  10:23 Найти цитируемый пост)
зато поумнеет 

возможно. главное, что бы следующим шагом не было написание gta5.

Автор: Dmi3ev 10.3.2009, 10:34
Цитата

возможно. главное, что бы следующим шагом не было написание gta5. 

я тоже считаю, что шестую надо писать, над пятой уже работают  smile 

Автор: Anikmar 10.3.2009, 12:29
 smile 
Вот так и рождаются баяны. Автор темы очень удивится, что ему столько ответов и ни одного по делу  smile 


Цитата(mrbrooks @  10.3.2009,  10:26 Найти цитируемый пост)
Цитата(zim22 @  10.3.2009,  10:23 )
зато поумнеет 


возможно. главное, что бы следующим шагом не было написание gta5. 


Думаю умнеть надо на других задачах. Написание своей "СУБД" в таком виде много знаний не прибавит. Лучше изучать какую-нибудь локальную простую СУБД и можно написать что-нибудь полезное для себя.

Автор: zim22 10.3.2009, 12:39
я думаю автор не там тему запостил. ему в центр помощи.

Автор: Dmi3ev 10.3.2009, 13:08
Anikmar, я же дал ему ссылку почти на то, что ему надо, вот код на основе ссылочки:
Код

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

struct militarian
{
    char name[24];
    char surname[27];
    char rank[24];
};

bool my_enter(char *fn)
{
        militarian m;
        cout<<"Enter name: "<<endl;
        cin>>m.name;
        cout<<"Enter surname: "<<endl;
        cin>>m.surname;
        cout<<"Enter rank: "<<endl;
        cin>>m.rank;

        ofstream fo;
        fo.open(fn, ios::app);
        if (!fo)
        {
            cout<<"TRY OPEN FILE \""<<fn<<"\" GET ERROR!"<<endl;
            return false;
        }
        fo<<m.name<<" "<<m.surname<<" "<<m.rank<<endl;
        fo.close();
        return true;
}

bool my_print(char *fn)
{
        ifstream fi;
        fi.open(fn);
        
        if (!fi)
        {
            cout<<"TRY OPEN    FILE \""<<fn<<"\"! GET ERROR!"<<endl;
            return false;
        }
        militarian m;
        printf("===============================================================================\n");
        printf("|          Name          |          Surname          |          Rank          |\n");
        printf("===============================================================================\n");
        while(!fi.eof())
        {
            fi>>m.name>>m.surname>>m.rank;
            printf("|");
            printf("%24s", m.name);
            printf("|");
            printf("%27s", m.surname);
            printf("|");
            printf("%24s", m.rank);
            printf("|\n");
            printf("-------------------------------------------------------------------------------\n");
        }
        fi.close();
        return true;
}
bool my_x2(char *fn)//можно делать проще, но для демонстрации сделал с вектором
{
        ifstream fi;
        fi.open(fn);
        vector<militarian> mv;
        if (!fi)
        {
            cout<<"TRY OPEN FILE \""<<fn<<"\" GET ERROR!"<<endl;
            return false;
        }

        militarian m;
        while (!fi.eof())
        {
            fi>>m.name>>m.surname>>m.rank;
            mv.push_back(m);            
        }
        fi.close();

        ofstream fo;
        fo.open(fn, ios::app);
        if (!fo)
        {
            cout<<"TRY OPEN FILE \""<<fn<<"\" GET ERROR!"<<endl;
            return false;
        }
        for (int i=0; i<mv.size(); i++)
            fo<<mv[i].name<<" "<<mv[i].surname<<" "<<mv[i].surname<<endl;
        fo.close();
        return true;
}


int _tmain()
{
        char filename[]="D:\\MYBD.txt";
        char c=0;
        while(c!='q')
        {
                cout<<"1 - Enter new."<<endl;
                cout<<"2 - Print all."<<endl;
                cout<<"3 - Delete all."<<endl;
                cout<<"4 - X 2."<<endl;
                cout<<"q - Quit."<<endl;
                cin>>c;
                switch(c)
                {
                        case '1':
                            my_enter(filename);
                            break;
                        case '2':
                            my_print(filename);
                            break;
                        case '3':
                            remove(filename);
                            break;
                        case '4':
                            my_x2(filename);
                            break;
                }
        }


    return 0;
}


Автор: andrew_121 10.3.2009, 13:10
Существует простая БД - http://www.vivtek.com/gdbm/
Или вот моя БД на основе бинарного дерева.

Автор: Anikmar 10.3.2009, 13:17
Цитата
 Dmi3ev:
 Anikmar, я же дал ему ссылку почти на то, что ему надо, вот код на основе ссылочки:


Ваше сообщение я не имел в виду как бесполезное, извините.   smile 

Автор: mrbrooks 10.3.2009, 13:33
Полезность - не полезность - главное намекнуть автору, что бы ерундой не занимался.

Автор: Dmi3ev 10.3.2009, 13:40
Цитата

Ваше сообщение я не имел в виду как бесполезное, извините.

да я про то, что раз автору сказали как делать, можно и пофлудить чуть-чуть))) несмертельно)))

Автор: suse 10.3.2009, 20:03
Спасибо! Посижу подумаю...

Автор: suse 19.3.2009, 11:25
Все гораздо проще оказывается. Нужно просто показать как работает очередь.
Вместо цифр в очередь загоняются строчки из текстового файла.
1 строчка 
2 строчка 
3 строчка 
Потом из этой очереди должны доставаться строчки и дописываться в файл.
В итоге должно получиться:
1 строчка
2 строчка
3 строчка
----------------
1 строчка 
2 строчка 
3 строчка
Все просто, но я не знаю как это сделать.
Видимо сначало нужно открыть файл, потом построчно считывать этой файл.
Загонять в очередь каждую строчку. Потом дописать в файл строчки из очереди.
Но как это сделать?

Автор: zim22 19.3.2009, 12:20
suse, идите в центр помощи.
или выкладывайте наработки кода.

Автор: suse 19.3.2009, 12:29
Ну наработки кода уже с самого верха написаны. Нужно только поменять код так чтобы вместо цифр 1,2,3,4,5 в очередь загонялись строчки из текстового файла. 

Автор: Anikmar 19.3.2009, 17:40
 smile 
Цитата(suse @  19.3.2009,  11:25 Найти цитируемый пост)
Все гораздо проще оказывается.

А вы, дураки, тут флудите!
 smile 

Автор: suse 19.3.2009, 19:03
Да я тоже сначала подумал о чём то сложном...

Автор: zim22 19.3.2009, 19:51
suse, действительно, всё оказалось элементарно.
используйте queue из STL

Автор: suse 19.3.2009, 21:25
Хороший ответ! А главное полезный   smile 

Автор: zim22 19.3.2009, 22:23
suse, не понял юмора. что вам не нравится?

Автор: suse 19.3.2009, 22:33
Да все нормально. Просто надо немного почитать и кое что понять. 

Автор: Anikmar 19.3.2009, 22:34
Цитата(suse @  19.3.2009,  21:25 Найти цитируемый пост)
Хороший ответ! А главное полезный     

Ну немного головой поработать ведь можно? Есть готоваяя очередь, пробуйте начинать писать. Либо действительно переходите в центр помощи.

Автор: suse 30.3.2009, 16:48
Вставил текстовой файл(имя, рост, вес) в папку... Не работает, но компилится. Borland 4.5
Код

#include <stdio.h>
#define N 10
void main()
{
 struct Node
 {
  char sim[10];
  float d1;
  int d2;
  Node *p;
 };
 FILE *u;
 u=fopen("stek.txt","r");
 if (u==NULL) {printf("Error"); return;}
  Node *top;
  Node *pv;
  pv=new Node;
  fscanf(u,"%s %f %d",pv->sim,&(pv->d1),&(pv->d2));
  pv->p=0;
  top=pv;

  while(1)
  {
    Node *pv=new Node;
    if (fscanf(u,"%s %f %d",pv->sim,&(pv->d1),&(pv->d2))==EOF)
          { delete pv; break;}
    pv->p=top;
    top=pv;
  }
  fclose(u);
  u=fopen("stek.txt","a");
  fprintf(u,"------------\n");
  while(top)
  {
    Node *pv;
    fprintf(u,"%s %6.2f %d \n",top->sim,top->d1,top->d2);
    pv=top;
    top=top->p;
    delete pv;
  }
  fclose(u);
}

Автор: Dmi3ev 30.3.2009, 17:12
Цитата

Не работает, но компилится.

тоже результат  smile 

Автор: Anikmar 30.3.2009, 17:14
Цитата(suse @  30.3.2009,  16:48 Найти цитируемый пост)
Вставил текстовой файл(имя, рост, вес) в папку... Не работает, но компилится. Borland 4.5


Некомпилится - где? Какую ошибку выдает?

Автор: suse 30.3.2009, 17:19
No module definition file specified: using defaults

Автор: Dmi3ev 30.3.2009, 17:19
Цитата

Некомпилится - где? Какую ошибку выдает?

Anikmar, все компилится, только не работает  smile потому что...

Автор: suse 30.3.2009, 17:21
Ну не понимаю...

Автор: Dmi3ev 30.3.2009, 17:27
suse, какого результата ты ждешь от своей проги...

Автор: suse 30.3.2009, 17:27
О! Заработало. Чудо! Только это была не очередь, а стек. Щас очередь сделаю.

Добавлено через 2 минуты и 12 секунд
Результат? Она должна имитировать работу очереди(стека). Ну в т.з. написано подробнее.

Автор: Anikmar 30.3.2009, 17:35
Цитата(suse @  30.3.2009,  17:27 Найти цитируемый пост)
О! Заработало. Чудо! Только это была не очередь, а стек

Так вы сами то знаете что пишете - очередь или стек?

Цитата(suse @  30.3.2009,  16:48 Найти цитируемый пост)
u=fopen("stek.txt","r");

А файл вы так назвали чисто из прикола?

Автор: suse 30.3.2009, 17:40
Надо и очередь и стек. Всех запутал!

Автор: Anikmar 30.3.2009, 18:12
Цитата(suse @  30.3.2009,  17:40 Найти цитируемый пост)
Надо и очередь и стек. Всех запутал! 

Не то слово.

Наведите порядок в коде.

Создайте класс очередь, класс стек (если, вас не устраивают стандартные). Сделайти их полностью работоспособными и отлаженными.

Затем отдельные методы: сохранить в файл/восстановить из файла.

Гораздо проще и аккуратнее будет.

А в вашем коде вообще - сначала считываем из файла, затем сохраняем. А если файла еще нет?

Автор: suse 31.3.2009, 00:55
Очередь
Код

#include <stdio.h>
void main()
{ struct Node
  {char sim[15];
  int d1;
  int d2;
  Node *p;
  };
FILE *u;
u=fopen("ochered.txt","r");
if(u==NULL) {printf("Error"); return;}
Node *pv;
pv=new Node;
fscanf(u,"%s %d %d",pv->sim,&(pv->d1),&(pv->d2));
pv->p=0;
Node *pbeg=pv;
Node *pend=pv;
while(1)
{
Node *pv=new Node;
if(fscanf(u,"%s %d %d",pv->sim,&(pv->d1),&(pv->d2))==EOF)
{delete pv; break;}
  pend->p=pv;
  pend=pv;
  }
  pend->p=0;
  fclose(u);
  u=fopen("ochered.txt","a");
  fprintf(u,"\n -------------- \n");
while(pbeg)
  {
  Node *pv;
  fprintf(u,"%s %d %d\n",pbeg->sim,pbeg->d1,pbeg->d2);
  pv=pbeg;
  pbeg=pbeg->p;
  delete pv;
  }
  fclose(u);
   }

Автор: Anikmar 31.3.2009, 07:25
Цитата(suse @  31.3.2009,  00:55 Найти цитируемый пост)
Очередь

Классно! И?  smile 

Автор: suse 31.3.2009, 20:55
А да вот пока и всё. Т.з. выполнил. Но скоро будет продолжение. 

Автор: zim22 1.4.2009, 07:13
 smile 
Цитата(suse @  31.3.2009,  20:55 Найти цитируемый пост)
Но скоро будет продолжение. 

Смотрите на экранах страны. Фильм ужасов "Мутация стека в очередь".

Автор: M0ZY 10.5.2009, 18:39
Теме ап,т.к. у меня появился вопрос

А почему в процедуре вывода на экран.
Вы используете "printf" вместо "cout"   ?

Автор: Dmi3ev 10.5.2009, 18:48
Цитата

Вы используете "printf" вместо "cout"   ? 

прежде чем я тебе отвечу, ответь мне а почему cout надо, а не printf?

Автор: M0ZY 10.5.2009, 19:13
ну мне пользоваться потоками ввода вывода удобней
не надо писать эти % и буковки,с которыми можно иногда запутаться...

и уточню я про http://forum.vingrad.ru/index.php?showtopic=250572&view=findpost&p=1807363 пост

во всей програмее вы используете и "printf" и "cout" 
в чём между ними разница и почему "printf" пригоднее для процедуры вывода на экран???

Автор: Dmi3ev 10.5.2009, 22:44
M0ZY, таблицу надо выводить красиво, те чтобы выводилось одно под другим (не съезжало), + раздилители столбцов, ячейки чтобы красивые были, и в тот момент моя левая пятка хотела реализовать это так... а сейчас если буду делать тоже самое, хз, может и потоки возьму... переделайте с помощью потоков, это несложно... а результат можете здесь выложить... чтобы выбор был у следующих поколений.

Автор: M0ZY 11.5.2009, 20:00
Эмм...
Я как бы и являюсь следующим поколением)))
Набрёл я на этот топик,только благо тому,что я дожен написать простенькую базу данных.
Я выбра С++,т.к. так интересней.
И я лучше спрошу как реализовать такой пункт как 
"5 - Edit Record" ?

И как переделать что бы было не
"3 - Delete all."
а
"3 - Delete record." ?

Я ещё плохо разбираюсь в С++,но как я понимаю это надо реализвать при помощи потоков?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)