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

实训C++语言设计——BookManage图书管理系统

2008-02-17 22:39 363 查看
平台:VC++ 2005 测试通过!
.vcproj
这是使用应用程序向导生成的 VC++ 项目的主项目文件。
它包含生成该文件的 Visual C++ 的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。
StdAfx.h, StdAfx.cpp
这些文件用于生成名为 twod.pch 的预编译头 (PCH) 文件和名为 StdAfx.obj 的预编译类型文件。
这些都是使用应用程序向导生成的 VC++ 文件故不列出
我只列出程序主要部分!

// BookManage_FILE.h

#include <iostream>
#include <fstream>
#include <list>
#include <algorithm>
#include <string>
using namespace std;

const char* szDbName = "output.data";
const char* szFileName = "bookinfo.txt";

typedef struct {
char key[14];//要多分配一个单元用来存放'/0'
string BookName;
string Author;
string Publisher;
string PubDate;
} BookRecord;

typedef list<BookRecord> BookList;

//从文本文件中读取图书信息,文本的格式为
//7-05-012050-5|计算机算法|李劲|高等教育出版社|2002-5-1
bool readDataFromFile(BookList& BL);
void genDB(const BookList& BL);
void PrintBookInfo(const BookList& BL);
bool KeyComp(const BookRecord& br1, const BookRecord& br2);
bool NameComp(const BookRecord& br1, const BookRecord& br2);
bool AuthorComp(const BookRecord& br1, const BookRecord& br2);
bool PubDateComp(const BookRecord& br1, const BookRecord& br2);

bool KeyComp(const BookRecord& br1, const BookRecord& br2){
if (br1.key[0] < br2.key[0]) return true;
else return false;
}

bool NameComp(const BookRecord& br1, const BookRecord& br2){
if (br1.BookName < br2.BookName) return true;
else return false;
}

bool AuthorComp(const BookRecord& br1, const BookRecord& br2){
if (br1.Author < br2.Author) return true;
else return false;
}

bool PubDateComp(const BookRecord& br1, const BookRecord& br2){
if (br1.PubDate < br2.PubDate) return true;
else return false;
}

void PrintBookInfo(const BookList& BL){
if( BL.empty() )
cout<<"没有图书信息!";
else{
/*定义遍历链表的迭代子*/
list<BookRecord>::const_iterator iter = BL.begin();
for(int i = 0; i<BL.size(); i++ ){
cout<<(*iter).key<<" | "
<<(*iter).BookName<<" | "
<<(*iter).Author<<" | "
<<(*iter).Publisher<<" | "
<<(*iter).PubDate<<endl;
iter++;
}
cout << endl;
}
}

bool readDataFromFile(BookList& BL){
//打开图书文本文件
ifstream bkFile(szFileName);
if ( !bkFile ) {
cerr << "不能打开文件 -" <<szFileName;
cout<<endl;
return false;
}
//存放一条图书记录
string strBookRec;
BookRecord abookRec;
while( getline(bkFile,strBookRec) ){
/*将strBookRec按'|'进行分解*/
int pos;
pos = strBookRec.find_first_of('|');
strcpy(abookRec.key, strBookRec.substr(0,pos).c_str());
strBookRec = strBookRec.substr(pos+1,strBookRec.length()); // 从中间第n+1字符到未尾的字符串

pos = strBookRec.find_first_of('|');
abookRec.BookName = strBookRec.substr(0,pos); // 前面的n个字符
strBookRec = strBookRec.substr(pos+1,strBookRec.length()); // 从中间第n+1字符到未尾的字符串

pos = strBookRec.find_first_of('|');
abookRec.Author = strBookRec.substr(0,pos); // 前面的n个字符
strBookRec = strBookRec.substr(pos+1,strBookRec.length()); // 从中间第n+1字符到未尾的字符串

pos = strBookRec.find_first_of('|');
abookRec.Publisher = strBookRec.substr(0,pos); // 前面的n个字符
strBookRec = strBookRec.substr(pos+1,strBookRec.length()); // 从中间第n+1字符到未尾的字符串

pos = strBookRec.find_first_of('|');
abookRec.PubDate = strBookRec.substr(0,pos); // 前面的n个字符
strBookRec = strBookRec.substr(pos+1,strBookRec.length()); // 从中间第n+1字符到未尾的字符串

BL.push_back(abookRec);
}
return true;
}

void genDB(const BookList& BL){
ofstream outfile(szDbName);
list<BookRecord>::const_iterator iter = BL.begin();

if(!outfile)
cerr << "无法创建图书信息数据库!";
else {
for(int i = 0; i<BL.size(); i++ ){
outfile <<(*iter).key<<" | "
<<(*iter).BookName<<" | "
<<(*iter).Author<<" | "
<<(*iter).Publisher<<" | "
<<(*iter).PubDate<<endl;
iter++;
} //end for
}

}

// BookManage_FILE.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "BookManage_FILE.h"

//下面定义了一个比较函数指针数组
bool (*sort_func_addrs[4])(const BookRecord&, const BookRecord&) = {
KeyComp, NameComp, AuthorComp, PubDateComp
};

int _tmain(int argc, _TCHAR* argv[])
{
BookList aBookList;
if (readDataFromFile(aBookList)){
cout <<"请选择书籍信息的排序标准"<<endl
<<"0. 书号, 1. 书名, 2. 作者, 3. 出版日期 :";
int sortcriterion = 0;
cin >> sortcriterion;
aBookList.sort(sort_func_addrs[sortcriterion]);
PrintBookInfo(aBookList);
genDB(aBookList);
}

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