图书管理系统(C++)
#ifndef __C_BOOK_H__ #define __C_BOOK_H__ #include<string> #include<iostream> using namespace std; #define NUM1 128 #define NUM2 50 class c_Book { public: c_Book(); c_Book(string cName,string cIsbn, string cPrice, string cAuthor); ~c_Book(); public: string GetName(); void SetName(string cName); string GetIsbn(); void SetIsbn(string cIsbn); string GetPrice(); void SetPrice(string cPrice); string GetAuthor(); void SetAuthor(); void WriteData(); void DeleteData(int iCount); void GetBookFromFile(int iCount); private: string m_cName; string m_cIsbn; string m_cPrice; string m_cAuthor; }; #endif // !__C_BOOK_H__ #include "stdafx.h" #include "c_Book.h" #include<fstream> c_Book::c_Book() { } c_Book::c_Book(string cName, string cIsbn, string cPrice, string cAuthor) :m_cName(cName),m_cIsbn(cIsbn),m_cPrice(cPrice),m_cAuthor(cAuthor) { } c_Book::~c_Book() { } string c_Book::GetName() { return m_cName; } void c_Book::SetName(string cName) { m_cName = cName; } string c_Book::GetIsbn() { return m_cIsbn; } void c_Book::SetIsbn(string cIsbn) { m_cIsbn = cIsbn; } string c_Book::GetPrice() { return m_cPrice; } void c_Book::SetPrice(string cPrice) { m_cPrice = cPrice; } string c_Book::GetAuthor() { return m_cAuthor; } void c_Book::SetAuthor() { m_cAuthor = m_cAuthor; } //将数据写入文件中 void c_Book::WriteData() { ofstream oFile; oFile.open("book.txt", ios::binary|ios::app); try { oFile.write(m_cName.c_str(),NUM1); oFile.write(m_cIsbn.c_str(), NUM1); oFile.write(m_cPrice.c_str(), NUM2); oFile.write(m_cAuthor.c_str(), NUM2); } catch(...) { throw("file error occurred!"); oFile.close(); } oFile.close(); } //从文件中删除数据,创建一个临时的文件,把不删除的部分放在临时文件 void c_Book::DeleteData(int iCount) { long resPos; int iDataCount = 0; char tempBuf[NUM1*2+NUM2*2]; fstream file("book.txt",ios::binary|ios::in|ios::out); fstream tempFile("temp.txt",ios::binary|ios::in|ios::out|ios::trunc); ofstream oFile; file.seekg(0,ios::end); resPos = file.tellg(); iDataCount = resPos / (NUM1 * 2 + NUM2 * 2); if (iDataCount < 0 || iDataCount < iCount) { throw "input number error"; } else { file.seekg(iCount*(NUM1 * 2 + NUM2 * 2), ios::beg); for (int i = 0; i < (iDataCount - iCount);i++) { memset(tempBuf,0, NUM1 * 2 + NUM2 * 2); file.read(tempBuf, NUM1 * 2 + NUM2 * 2); tempFile.write(tempBuf, NUM1 * 2 + NUM2 * 2); } file.close(); tempFile.seekg(0,ios::beg); oFile.open("book.txt"); oFile.seekp((iCount-1)*(NUM1 * 2 + NUM2 * 2),ios::beg); for (int i = 0; i < (iDataCount-iCount); i++) { memset(tempBuf, 0, NUM1 * 2 + NUM2 * 2); tempFile.read(tempBuf, NUM1 * 2 + NUM2 * 2); oFile.write(tempBuf, NUM1 * 2 + NUM2 * 2); } } tempFile.close(); oFile.close(); remove("temp.txt"); } //获取文件中的数据 void c_Book::GetBookFromFile(int iCount) { char cName[NUM1]; char cIsbn[NUM1]; char cPrice[NUM2]; char cAuthor[NUM2]; ifstream iFile("book.txt", ios::binary); try { iFile.seekg(iCount*(NUM1 + NUM1 + NUM2 + NUM2), ios::beg); iFile.read(cName, NUM1); if (iFile.tellg() > 0) { m_cName = cName; } iFile.read(cIsbn, NUM1); if (iFile.tellg() > 0) { m_cIsbn = cIsbn; } iFile.read(cPrice, NUM2); if (iFile.tellg() > 0) { m_cPrice = cPrice; } iFile.read(cAuthor, NUM2); if (iFile.tellg() > 0) { m_cAuthor = cAuthor; } } catch (...) { throw("file error occurred!"); iFile.close(); } iFile.close(); } // 图书馆管理系统.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include<iomanip> #include<fstream> #include"c_Book.h" using namespace std; #define CMD_COLS 80 #define CMD_LINES 25 #define PAGE 5 void SetScreenGrid(); void ClearScreen(); void SetSysCaption(const char* pText); void ShowWelcome(); void ShowRootMenu(); void WaitView(int iCurPage); void WaitUser(); void GuideInput(); int GetSelect(); long GetFileLength(ifstream &ifs); void ViewData(int iSelPage=1); void DeleteBookFromFile(); void MainLoop(); //设置屏幕的大小 void SetScreenGrid() { char sysSetBuf[80]; sprintf(sysSetBuf, "mode con cols=%d lines=%d", CMD_COLS, CMD_LINES); system(sysSetBuf); } //清屏 void ClearScreen() { system("cls"); } void SetSysCaption(const char *pText) { char sysSetBuf[80]; sprintf(sysSetBuf, "title %s", pText); system(sysSetBuf); } //设置欢迎信息e void ShowWelcome() { for (int i = 0; i < 7; i++) { cout << endl; } cout << setw(40); cout << "*******************" << endl; cout << setw(40); cout << "* 图书管理系统 *" << endl; cout << setw(40); cout << "*******************" << endl; } void ShowRootMenu() { cout << setw(37); cout << "请选择功能:" << endl; cout << endl; cout << setw(36); cout << "1.添加图书" << endl; cout << endl; cout << setw(36); cout << "2.遍历图书" << endl; cout << endl; cout << setw(36); cout << "3.删除图书" << endl; cout << endl; } //浏览数据的时候等待用户操作 void WaitView(int iCurPage) { string buf; cin >> buf; if (buf[0] == 'q') system("exit"); if (buf[0] == 'm') MainLoop(); if (buf[0] == 'n') ViewData(iCurPage); } //等待用户操作 void WaitUser() { int iInputPage = 0; cout << "enter 返回主菜单 q退出" << endl; string strBuf; cin >> strBuf; if (strBuf[0] == 'q') { system("exit"); } } int GetSelect() { char strSelect[256]; cin >> strSelect; return atoi(strSelect); } //添加图书信息 void GuideInput() { char inName[NUM1]; char inIsbn[NUM1]; char inPrice[NUM2]; char inAuthor[NUM2]; for (int i = 0; i < 7; i++) { cout << endl; } cout << setw(36); cout << "请输入书名:"; getchar(); gets_s(inName); cout << setw(36); cout << "请输入ISBN:"; cin >> inIsbn; cout << setw(36); cout << "请输入价格:"; cin >> inPrice; cout << setw(36); cout << "请输入作者:"; cin >> inAuthor; c_Book inBook(inName, inIsbn, inPrice, inAuthor); inBook.WriteData(); cout << "书籍已经添加!" << endl; WaitUser(); } long GetFileLength(ifstream &ifs) { long temPos; long resPos; temPos = ifs.tellg(); ifs.seekg(0, ios::end); resPos = ifs.tellg(); ifs.seekg(temPos, ios::beg); return resPos; } //浏览图书信息 void ViewData(int iSelPage) { int iPage = 0; int iCurPage = 0; int iDataCount = 0; char inName[NUM1]; char inIsbn[NUM1]; char inPrice[NUM2]; char inAuthor[NUM2]; bool bIndex = false; iCurPage = iSelPage; ifstream iFile; iFile.open("book.txt",ios::binary); iDataCount = GetFileLength(iFile) / (NUM1 * 2 + NUM2 * 2); if (iDataCount >= 1) { bIndex = true; } iPage = iDataCount / PAGE + 1; ClearScreen(); cout << "共有记录:" << iDataCount << " "; cout << "共有页数:" << iPage << " "; cout << "当前页数:" << iCurPage << " "; cout << "n 显示下一页 m 返回" << endl; cout << setw(5) << "index"; cout << setw(20) << "Name" << setw(20) << "Isbn"; cout << setw(15) << "price" << setw(15) << "author"; cout << endl; try { iFile.seekg((iCurPage-1) * PAGE * (NUM1 * 2 + NUM2 * 2), ios::beg); if (!iFile.fail()) { for (int i = 1; i <= PAGE; i++) { // cout << "********" << endl; memset(inName, 0, NUM1); memset(inIsbn, 0, NUM1); memset(inPrice, 0, NUM2); memset(inAuthor, 0, NUM2); if (bIndex) { cout << setw(3) << (iCurPage - 1) * PAGE + i; iFile.read(inName, NUM1); cout << setw(20) << inName; iFile.read(inIsbn, NUM1); cout << setw(25) << inIsbn; iFile.read(inPrice, NUM2); cout << setw(10) << inPrice; iFile.read(inAuthor, NUM2); cout << setw(16) << inAuthor; cout << endl; if (iFile.tellg() < 0) { bIndex = false; } else { bIndex = true; } } } } } catch (...) { cout << "throw file exception" << endl; throw "file error occurred"; iFile.close(); } if (iCurPage < iPage) { iCurPage = iCurPage + 1; WaitView(iCurPage); } else { WaitView(iCurPage); } iFile.close(); } //删除图书信息 void DeleteBookFromFile() { for (int i = 0; i < 7; i++) { cout << endl; } int iDelCount; cout << "input delete index" << endl; cin >> iDelCount; c_Book cDelBook; cDelBook.DeleteData(iDelCount); cout << "已经删除图书!" << endl; WaitUser; } //主循环 void MainLoop() { ShowWelcome(); while (1) { ClearScreen(); ShowWelcome(); ShowRootMenu(); switch (GetSelect()) { case 1: ClearScreen(); GuideInput(); break; case 2: ClearScreen(); ViewData(); break; case 3: ClearScreen(); DeleteBookFromFile(); break; } } } int main() { SetScreenGrid(); SetSysCaption("图书管理系统"); MainLoop(); return 0; }