База данных

Тема в разделе "Общие вопросы по С и С++", создана пользователем amstr1k, 14 окт 2010.

  1. amstr1k

    amstr1k Гость

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

    Пи.Си если написал не в тот раздел, просьба строго не судить
     
  2. kataklysm

    kataklysm Гость

    1. Это не база данных - это обычная сортировка.
    2. Ищите по темам: прочитать файл, массивы, сортировка, запись в файл.
     
  3. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Если будет время примерчик набросаю сегодня, ну а пока могу сказать, используй обычный файловый ввод/вывод, едиственное типозированных данных будь то структура или класс, где совокупность переменных это и есть твои поля Таблицы... А совокупность файлов (это и есть твоя БД).... А реализация будет твоя так называемая СУБД....
    И самое главное что файловый ввод/вывод ты должен осуществлять в бинарном режиме....
     
  4. amstr1k

    amstr1k Гость

    неплохо было бы посмотреть пример твой, а то начать незнаю с чего...
     
  5. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Ок... Щас по дому занят, через 2-3 часа выкину что-нить.... Хотя бы по ходу написания буду выкидывать...
     
  6. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Пока еще жутко занят, но если поймешь из этого хоть что то то отпишись
    Код (C++):
    #include <iostream>
    #include <fstream>


    using namespace std;
    class Worker
    {
    private:
    int Id; //Код сотрудника
    char Name[16]; //Фамилия
    char Soname[36]; //Имя
    char Father[16]; //Отчество
    public:
    Worker(int Id, char* Name, char* Soname, char* Father) //Конструктор со всеми парамметрами
    {
    Worker::Id = Id;
    strncpy(Worker::Soname,Soname,36);
    strncpy(Worker::Name,Name,16);
    strncpy(Worker::Father,Father,16);
    }

    friend ostream& operator << (ostream& out, const Worker W) //Перезагрузка операции << для ostrem
    {
    return out<<W.Soname<<'\t'<<W.Name<<'\t'<<W.Father;
    }

    };

    int main(void)
    {

    Worker Temp (1,"Denis","Goncharov","Valerevich"); //Создадим заполненый элемент класса

    //Запишим это все дело в файлы в бинарном режиме
    ofstream s("DDD.txt", std::ios::in|std::ios::binary); //Определим Имя файлы (как бы наша таблица), и режим работы
    s.write(reinterpret_cast<char*> (&Temp),sizeof(Temp)); //Говорим компилятору "Как хочешь, но преобразуй(!!!), но не больше чем размерность класса Temp
    s.close(); // Закроем файл

    //Этот закомментированный код что бы считать записанную инфу
    /*
    ifstream s("DDD.txt", ios::binary);
    s.read(reinterpret_cast<char*> (&Temp),sizeof(Temp));
    */


    cout<<Temp;


    return 0;
    }
     
  7. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (C++):
    #define _CRT_SECURE_NO_WARNINGS

    #include <iostream>
    #include <fstream>


    using namespace std;
    class Worker
    {
    private:
    int Id; //Код сотрудника
    char Name[16]; //Фамилия
    char Soname[36]; //Имя
    char Father[16]; //Отчество
    public:
    Worker(int Id, char* Name, char* Soname, char* Father) //Конструктор со всеми парамметрами
    {
    Worker::Id = Id;
    strncpy(Worker::Soname,Soname,36);
    strncpy(Worker::Name,Name,16);
    strncpy(Worker::Father,Father,16);
    }

    friend ostream& operator << (ostream& out, const Worker W) //Перезагрузка операции << для ostrem
    {
    return out<<W.Soname<<'\t'<<W.Name<<'\t'<<W.Father;
    }

    };

    int main(void)
    {
    //Выпито уже 2,5 л. пива... Писать тяжко, так что за баги и обибки сразу прошу прощение... Хотя стараюсь отлаживать в MS VC++

    //Из прошлого поста мы выяснили, что у нас есть файлы DDD.txt, с хранимымы данными о сотудниках.. их АйДи + ФИО, переименуем его в Worker
    ifstream s("Worker.dat", ios::binary); // Файловый поток вывода
    s.seekg(0,ios::end); //Переместимся в конец фала
    int WorkerCount = s.tellg()/sizeof(Worker); //Посчитаем и выведим записи Текущая позиция в байтах / на размер в байтах класса Worker
    cout<<"Count Record in Workers : "<<WorkerCount<<endl;







    //ofstream s("DDD.txt", ios::out|ios::app|ios::binary) ; //Открыть только для записи, дописывать данные в конец файла, Открыть для двоичного обмена
    //s.seekg(0,ios::end); //Переместить курсор в конец файла
    //std::cout<<"DDDD:";
    //Worker *Arr = new Worker[

    //whil


    //Запишим это все дело в файлы в бинарном режиме
    /*ofstream s("DDD.txt", std::ios::in|std::ios::binary); //Определим Имя файлы (как бы наша таблица), и режим работы
    s.write(reinterpret_cast<char*> (&Temp),sizeof(Temp)); //Говорим компилятору "Как хочешь, но преобразуй(!!!), но не больше чем размерность класса Temp
    s.close(); // Закроем файл
    */


    //Этот закомментированный код что бы считать записанную инфу
    ///*
    //ifstream s("DDD.txt", ios::binary);

    //s.read(reinterpret_cast<char*> (&Temp),sizeof(Temp));
    //*/



    //cout<<Temp;


    return 0;
    }
     
  8. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    2amstr1k: Сорь, чет друзья приехали в гости, перебрал малек, мозги вообще не варят, долбаный switch писал минут 40.... Если не разобрался еще отпишисьзавтра помогу, счегодня реально - не АЛЕ.... Уороче не в состоянии...плмтю сто послндгнн мог навоять......

    Код (C++):
    #define _CRT_SECURE_NO_WARNINGS

    #include <iostream>
    #include <fstream>


    using namespace std;
    class Worker
    {
    private:
    int Id; //Код сотрудника
    char Name[16]; //Фамилия
    char Soname[36]; //Имя
    char Father[16]; //Отчество
    public:
    Worker(int Id, char* Name, char* Soname, char* Father) //Конструктор со всеми парамметрами
    {
    Worker::Id = Id;
    strncpy(Worker::Soname,Soname,36);
    strncpy(Worker::Name,Name,16);
    strncpy(Worker::Father,Father,16);
    }

    friend ostream& operator << (ostream& out, const Worker W) //Перезагрузка операции << для ostrem
    {
    return out<<W.Soname<<'\t'<<W.Name<<'\t'<<W.Father;
    }

    };

    void Menu (void)
    {
    cout<<"Input Workers <1>"<<endl;
    cout<<"List Workers <2>"<<endl;
    cout<<"Delete Workers <3>"<<endl;

    char IOMenu;
    cin>>IOMenu;

    switch (IOMenu)
    {
    case '1': std::cout<<"Nah!!"<<endl; break;
    case '2': std::cout<<"Nah!!!"<<endl; break;
    case '3': std::cout<<"Nah!!!"<<endl; break;
    default:
    Menu();

    }

    }


    int main(void)
    {
    //Выпито уже 2,5 л. пива... Писать тяжко, так что за баги и обибки сразу прошу прощение... Хотя стараюсь отлаживать в MS VC++

    //Из прошлого поста мы выяснили, что у нас есть файлы DDD.txt, с хранимымы данными о сотудниках.. их АйДи + ФИО, переименуем его в Worker
    ifstream s("Worker.dat", ios::binary); // Файловый поток вывода
    s.seekg(0,ios::end); //Переместимся в конец фала
    int WorkerCount = s.tellg()/sizeof(Worker); //Посчитаем и выведим записи Текущая позиция в байтах / на размер в байтах класса Worker
    cout<<"Count Record in Workers : "<<WorkerCount<<endl;

    Menu();








    //ofstream s("DDD.txt", ios::out|ios::app|ios::binary) ; //Открыть только для записи, дописывать данные в конец файла, Открыть для двоичного обмена
    //s.seekg(0,ios::end); //Переместить курсор в конец файла
    //std::cout<<"DDDD:";
    //Worker *Arr = new Worker[

    //whil


    //Запишим это все дело в файлы в бинарном режиме
    /*ofstream s("DDD.txt", std::ios::in|std::ios::binary); //Определим Имя файлы (как бы наша таблица), и режим работы
    s.write(reinterpret_cast<char*> (&Temp),sizeof(Temp)); //Говорим компилятору "Как хочешь, но преобразуй(!!!), но не больше чем размерность класса Temp
    s.close(); // Закроем файл
    */


    //Этот закомментированный код что бы считать записанную инфу
    ///*
    //ifstream s("DDD.txt", ios::binary);

    //s.read(reinterpret_cast<char*> (&Temp),sizeof(Temp));
    //*/



    //cout<<Temp;


    return 0;
    }
     
  9. amstr1k

    amstr1k Гость

    хотелось бы дальше код увидеть)
     
  10. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Ок))) У меня вчера так башка болела, что к компу почти и не подходил)))
    С работы домой приеду продолжу с комментариями. ;-)
     
  11. amstr1k

    amstr1k Гость

    Код (C++):
    #include <conio.h>
    #include <vector>
    #include <fstream>
    #include <iostream>
    #include <iomanip>
    using namespace std;

    vector<char*>& arr = *new vector<char*>;

    void print()
    {
    if(arr.size() % 6 != 0) arr.clear();
    system("cls");
    cout << "                                                                             " << endl;
    cout << "  Фамилия    СетевойАдрес  Подключение ОбъемТрафика ДенегНаСчету НомерСчета " << endl;
    cout << "                                                                             " << endl;
    for(int i = 0; i < arr.size(); i+=6)
    cout
    << " " << setw(11) << arr[i]
    << " " << setw(16) << arr[i+1]
    << " " << setw(11) << arr[i+2]
    << " " << setw(12) << arr[i+3]
    << " " << setw(12) << arr[i+4]
    << " " << setw(10) << arr[i+5]
    << " " << endl << endl;
    cout << endl;
    }

    void sort()
    {
    for(int j = 6; j < arr.size(); j+=6)
    for(int i = 6; i < arr.size(); i+=6)
    {
    __int64 t1, t2;
    int a1,b1,c1,d1, a2,b2,c2,d2;
    sscanf(arr[i-5], "%d.%d.%d.%d", &a1, &b1, &c1, &d1);
    sscanf(arr[i+1], "%d.%d.%d.%d", &a2, &b2, &c2, &d2);
    t1 = (__int64)d1 + (__int64)c1 * 1000 + (__int64)b1 * 1000000 + (__int64)a1 * 1000000000;
    t2 = (__int64)d2 + (__int64)c2 * 1000 + (__int64)b2 * 1000000 + (__int64)a2 * 1000000000;
    if(t1 > t2)
    {    
    swap(arr[i-6], arr[i]);
    swap(arr[i-5], arr[i+1]);
    swap(arr[i-4], arr[i+2]);
    swap(arr[i-3], arr[i+3]);
    swap(arr[i-2], arr[i+4]);
    swap(arr[i-1], arr[i+5]);
    }
    }
    }

    void load()
    {
    arr.clear();
    ifstream inp("base.txt");
    while(!inp.eof())
    {
    char* temp = new char[256];
    inp.getline(temp, 256);
    arr.push_back(temp);
    }
    inp.close();
    }

    void save()
    {
    ofstream out("base.txt", ios_base::app);
    char temp[256];
    cout << "Введите фамилию: ";
    cin >> temp;

    cout << "Введите IP (a b c d): ";
    short a, b, c, d;
    cin >> a >> b >> c >> d;

    cout << "Введите Дату Подключения (dd mm yy): ";
    short dd, mm, yy;
    cin >> dd >> mm >> yy;

    cout << "ОбъемТрафика: ";
    int traf; cin >> traf;

    cout << "ДенегНаСчету: ";
    int deneg; cin >> deneg;

    cout << "НомерСчета: ";
    int num; cin >> num;

    if(arr.size() >= 6) out << endl;;
    out << temp << endl;
    out << a << "." << b << "." << c << "." << d << endl;
    out << dd << "." << mm << "." << yy << endl;
    out << traf << endl;
    out << deneg << endl;
    out << num;

    out.close();
    }

    void del()
    {
    if(arr.size() < 6) return;
    ofstream out("base.txt");
    for(int i = 0; i < arr.size() - 6; i++)
    {
    out << arr[i];
    if(i != arr.size()-7) out << endl;
    }
    out.close();
    }

    void find()
    {
    cout << "Введите номер счёта: ";
    int f;
    cin >> f;
    char temp[256];
    sprintf(temp, "%d", f);
    for(int i = 5; i < arr.size(); i+=6)
    if(strcmp(temp, arr[i]) == 0)
    {
    cout << "Найдено" << endl;
    _getch();
    return;
    }
    cout << "Не найдено" << endl;
    _getch();
    return;
    }
    int main()
    {    
    setlocale(LC_ALL, ".1251");

    load();

    int c = 0;
    while(c != 48)
    {
    print();
    cout << "Возможные действия:" << endl;
    cout << "0-Выход. 1-Добавить запись. 2-Удалить последню запись. 3-Поиск. 4-Сортировка" << endl << endl;;
    c = _getch();
    switch(c)
    {
    case 49: save(); load(); break;
    case 50: del(); load(); break;
    case 51: find();
    case 52: sort(); break;
    }
    }
    return 0;
    }
    че та не работает, можете поправить че не так?
     
  12. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Вообщем если на момент открытия у тебя файл "base.txt" не создан то у тебя цикл
    while(!inp.eof()) - бесконечен, поэтому нужно проверить до него и если что выйти или создать файл
    Код (C++):
    void load()
    {
    arr.clear();
    ifstream inp("base.txt");

    //*ДОБАВЛЕНО Если istream не создан (нету файла), выйдим из функции и выведем данные об ошибки
    if (!inp)
    {
    cout<<"Base.txt - not found. Open is error"<<endl;
    system("pause");
    return;
    }
    //
    while(!inp.eof())
    {
    char* temp = new char[256];
    inp.getline(temp, 256);
    arr.push_back(temp);
    }
    inp.close();
    }
     
  13. amstr1k

    amstr1k Гость

    можешь код поправить чтобы прога работала?
     
  14. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Замени функцию load() как указанно выше и все будет работать....
     
  15. amstr1k

    amstr1k Гость

    заменил, прога компилируется, вводишь имя, ип и все, гуд бай
     
  16. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    IP вводить там нужно через пробел
    192 168 0 1
    к примеру так
     
  17. amstr1k

    amstr1k Гость

    над будет еще над поиском как то поработать)
     
Загрузка...
Похожие Темы - База данных
  1. Zhuk
    Ответов:
    18
    Просмотров:
    1.962
  2. ALEXandr2033
    Ответов:
    0
    Просмотров:
    1.081
  3. Apoka5555
    Ответов:
    0
    Просмотров:
    1.574
  4. Anneta
    Ответов:
    1
    Просмотров:
    1.706
  5. Delete
    Ответов:
    4
    Просмотров:
    2.036

Поделиться этой страницей