База данных

  • Автор темы amstr1k
  • Дата начала
A

amstr1k

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

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

kataklysm

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

DarkKnight

Well-Known Member
01.08.2010
653
0
#3
Если будет время примерчик набросаю сегодня, ну а пока могу сказать, используй обычный файловый ввод/вывод, едиственное типозированных данных будь то структура или класс, где совокупность переменных это и есть твои поля Таблицы... А совокупность файлов (это и есть твоя БД).... А реализация будет твоя так называемая СУБД....
И самое главное что файловый ввод/вывод ты должен осуществлять в бинарном режиме....
 
A

amstr1k

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

DarkKnight

Well-Known Member
01.08.2010
653
0
#5
Ок... Щас по дому занят, через 2-3 часа выкину что-нить.... Хотя бы по ходу написания буду выкидывать...
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#6
Пока еще жутко занят, но если поймешь из этого хоть что то то отпишись
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;
}
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#7
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;
}
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#8
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;
}
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#10
Ок))) У меня вчера так башка болела, что к компу почти и не подходил)))
С работы домой приеду продолжу с комментариями. ;-)
 
A

amstr1k

Гость
#11
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;
}
че та не работает, можете поправить че не так?
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#12
Вообщем если на момент открытия у тебя файл "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();
}
 
A

amstr1k

Гость
#13
Вообщем если на момент открытия у тебя файл "base.txt" не создан то у тебя цикл
while(!inp.eof()) - бесконечен, поэтому нужно проверить до него и если что выйти или создать файл
можешь код поправить чтобы прога работала?
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#14
Замени функцию load() как указанно выше и все будет работать....
 
A

amstr1k

Гость
#17
над будет еще над поиском как то поработать)