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提供了数据操作的基本接口
基本文件读写采用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++ string split分割字符串
- 【算法学习】快包算法
- c语言==字符数组与字符串,char的取值范围(1)
- stm32 学习经历—环境搭建 以103 407搭建 3/3
- C++模板类链接错误:LNK2001, LNK2019
- C++第7次作业
- stm32 学习经历—环境搭建 以103 407搭建 3/2
- 《C++沉思录》——类设计核查表、代理类、句柄类
- C++面试宝典
- c++第七次实验-2
- C++第7次作业
- 第七次C++作业-特殊三位数
- C++ 引用的作用和用法
- 第七次C++实验-素数和回文
- C++第7次实验---杨辉三角
- C++走向远洋——63(项目二2、两个成员的类模板)
- c++编码绝对路径与相对路径浅析
- 调试入门
- C++走向远洋——62(项目二1、类模板)
- C++中谈重载、覆盖、和隐藏