您的位置:首页 > 编程语言 > C语言/C++

C++ 实现一个二进与文本形式存储的小型数据库(未完成)

2016-06-04 15:16 447 查看
一个用C++实现的小型数据表,只考虑基本功能, 没考虑数据的规模,稳定性并发等操作。

基本文件读写采用ifstream 和ofstream,字符串处理采用sstream, xml读写计划采用libxml开源库

1,设计纯粹数据库的数据结构采用struct定义记录,封装在class中

2,功能定义

1)二进制方式存储数据和基本打印功能 OK

2)XML文本方式存储数据和基本打印功能 N/A

3) 二进制数据文件和XML方式数据文件互相转换 N/A

3,class提供了数据操作的基本接口

addData(); //增加记录
printAddressBook(); //打印当前数据
loadAddressBook();  //从文件读取记录
saveAddressBook(); //保持数据表


#include <iostream>
#include <string.h>
#include <memory>
#include <list>
#include <fstream>
#include <sstream>

//Global definition for the minimum database.
const char strDbName[] = "data.bin";
const char strTab[] = "\t";
const char strDoubleTab[] = "\t\t";

typedef struct _addressData
{
unsigned int id;
char name[20];
char number[10];
char address[50];

} addressData;

class address_book
{
public:
address_book(){}
address_book(const address_book& r)
:m_lstData(r.m_lstData)
{
}

address_book& operator=(const address_book& r)
{
m_lstData = r.m_lstData;
}

void addData(const addressData& data)
{
m_lstData.push_back(data);
}

void printAddressBook() const
{
std::cout<<"ID\tName\t\tNumber\t\tAddress\n";
for(std::list<addressData>::const_iterator iter = m_lstData.begin(); iter!= m_lstData.end(); ++iter)
{
std::cout<<static_cast<addressData>(*iter).id<<strTab<<
static_cast<addressData>(*iter).name<<strDoubleTab<<
static_cast<addressData>(*iter).number<<strDoubleTab<<
static_cast<addressData>(*iter).address<<std::endl;
}

}

void saveAddressBook()
{
std::ofstream out;
out.open(strDbName, std::ios::out | std::ios::binary);
for(std::list<addressData>::const_iterator iter = m_lstData.begin(); iter!= m_lstData.end(); ++iter)
{
out<<static_cast<addressData>(*iter).id<<" "<<
static_cast<addressData>(*iter).name<<" "<<
static_cast<addressData>(*iter).number<<" "<<
static_cast<addressData>(*iter).address<<std::endl;
}

}

void loadAddressBook()
{
std::ifstream in;

char buffer[256];
in.open(strDbName, std::ios::in | std::ios::binary);
if (! in.is_open())
{
std::cout << "Error opening file";
return;
}
m_lstData.clear(); // clear the current data in the list container.
while (!in.eof() )
{
in.getline (buffer,100);
if(strlen(buffer)<=2)
return;
std::stringstream ss(buffer);
addressData aData;
ss>>aData.id>>aData.name>>aData.number>>aData.address;
m_lstData.push_back(aData);
}

}

private:
std::list<addressData> m_lstData;
};

int main()
{
/*Unit Test Case to use the interfaces
addData();
printAddressBook();
loadAddressBook();
saveAddressBook();
*/
address_book book;
addressData a[] = {{0,"tom","12345","anarbor,Detriot,MI"},{1,"mum","12344","Santa,CA"},{2,"johnson","12331","Vollay,WI"}};
for(int i = 0; i<3; ++i)
book.addData(a[i]);
book.printAddressBook();
book.saveAddressBook();

address_book book1;
book1.loadAddressBook();
book1.printAddressBook();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: