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

一个用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;
}



你可能感兴趣的:(C++,数据库,Stream,文件操作)