C++ 实现图书管理系统(文件操作与类)
背景
现在很多图书馆、书店、个人的藏书、电子图书馆等都需要一个可以管理图书的系统,对于这样的需求,我们可以使用 C++ 语言来实现。
本文将会介绍如何使用 C++ 实现一个图书管理系统,并使用文件操作和面向对象的方式来进行数据保存和管理。
思路
我们需要实现一个图书管理系统,这个系统应该包含以下功能:
- 添加图书
- 删除图书
- 修改图书信息
- 查询图书
- 显示图书信息
我们可以使用一个名为 Book
的类来表示书籍,类中包含以下属性:
- 书籍编号
- 书籍名称
- 作者
- 出版社
- 出版日期
- 价格
图书管理系统可以使用一个 BookRepository
类来管理 Book
类的对象,这个类应该包含以下功能:
- 添加书籍
- 删除书籍
- 修改书籍信息
- 查询书籍
- 显示所有书籍信息
同时,我们需要使用文件操作来保存和读取数据,这样可以保证数据的持久化和随时可用。
文件操作
在 C++ 中,我们可以使用 fstream
来进行文件操作,其中 fstream
包括 ifstream
和 ofstream
,分别表示读和写操作。
我们可以使用 ofstream
来创建并打开一个输出文件流,然后使用 <<
操作符将数据写入文件中。例如:
#include <fstream>
#include <string>
using namespace std;
int main() {
// 创建一个输出文件流
ofstream fout("books.txt");
// 写入数据
fout << "book1\n";
fout << "book2\n";
// 关闭文件流
fout.close();
return 0;
}
我们也可以使用 ifstream
来创建并打开一个输入文件流,然后使用 >>
操作符从文件中读取数据。例如:
#include <fstream>
#include <string>
using namespace std;
int main() {
// 创建一个输入文件流
ifstream fin("books.txt");
// 读取数据
string firstBook, secondBook;
fin >> firstBook >> secondBook;
// 关闭文件流
fin.close();
return 0;
}
类定义
在这个系统中,我们可以定义 Book
类来表示书籍,该类包含以下属性:
class Book {
public:
// 构造函数
Book(int id, string name, string author, string press, string date, double price);
// 获取属性值
int getId() const;
string getName() const;
string getAuthor() const;
string getPress() const;
string getDate() const;
double getPrice() const;
// 设置属性值
void setId(int id);
void setName(string name);
void setAuthor(string author);
void setPress(string press);
void setDate(string date);
void setPrice(double price);
// 输出书籍信息
void printBook() const;
private:
// 书籍属性
int id_;
string name_;
string author_;
string press_;
string date_;
double price_;
};
该类的实现如下:
Book::Book(int id, string name, string author, string press, string date, double price) {
this->id_ = id;
this->name_ = name;
this->author_ = author;
this->press_ = press;
this->date_ = date;
this->price_ = price;
}
int Book::getId() const {
return this->id_;
}
string Book::getName() const {
return this->name_;
}
string Book::getAuthor() const {
return this->author_;
}
string Book::getPress() const {
return this->press_;
}
string Book::getDate() const {
return this->date_;
}
double Book::getPrice() const {
return this->price_;
}
void Book::setId(int id) {
this->id_ = id;
}
void Book::setName(string name) {
this->name_ = name;
}
void Book::setAuthor(string author) {
this->author_ = author;
}
void Book::setPress(string press) {
this->press_ = press;
}
void Book::setDate(string date) {
this->date_ = date;
}
void Book::setPrice(double price) {
this->price_ = price;
}
void Book::printBook() const {
cout << "***************************************" << endl;
cout << "编号: " << this->id_ << endl;
cout << "名称: " << this->name_ << endl;
cout << "作者: " << this->author_ << endl;
cout << "出版社:" << this->press_ << endl;
cout << "出版日期:" << this->date_ << endl;
cout << "价格: " << this->price_ << endl;
cout << "***************************************" << endl;
}
我们也可以定义一个 BookRepository
类来管理 Book
对象,该类包含以下方法:
class BookRepository {
public:
// 构造函数
BookRepository(string filePath);
// 添加书籍
void add(const Book& book);
// 删除书籍
bool remove(int id);
// 修改书籍信息
bool modify(const Book& book);
// 查询书籍
Book* find(int id);
// 显示所有书籍信息
void listAllBooks() const;
private:
// 文件路径
string filePath_;
// 图书列表
vector<Book> books_;
// 从文件中读取数据到图书列表
void loadBooksFromFile();
// 将图书列表保存到文件中
void saveBooksToFile() const;
};
该类的实现如下:
BookRepository::BookRepository(string filePath) {
this->filePath_ = filePath;
this->loadBooksFromFile();
}
void BookRepository::add(const Book& book) {
this->books_.push_back(book);
this->saveBooksToFile();
}
bool BookRepository::remove(int id) {
for (auto it = this->books_.begin(); it != this->books_.end(); ++it) {
if (it->getId() == id) {
this->books_.erase(it);
this->saveBooksToFile();
return true;
}
}
return false;
}
bool BookRepository::modify(const Book& book) {
for (auto& it : this->books_) {
if (it.getId() == book.getId()) {
it.setName(book.getName());
it.setAuthor(book.getAuthor());
it.setPress(book.getPress());
it.setDate(book.getDate());
it.setPrice(book.getPrice());
this->saveBooksToFile();
return true;
}
}
return false;
}
Book* BookRepository::find(int id) {
for (auto& it : this->books_) {
if (it.getId() == id) {
return ⁢
}
}
return nullptr;
}
void BookRepository::listAllBooks() const {
for (auto& it : this->books_) {
it.printBook();
}
}
void BookRepository::loadBooksFromFile() {
ifstream fin(this->filePath_);
if (!fin) {
return;
}
int id;
string name, author, press, date;
double price;
while (fin >> id >> name >> author >> press >> date >> price) {
Book book(id, name, author, press, date, price);
this->books_.push_back(book);
}
fin.close();
}
void BookRepository::saveBooksToFile() const {
ofstream fout(this->filePath_);
for (auto& it : this->books_) {
fout << it.getId() << " " << it.getName() << " "
<< it.getAuthor() << " " << it.getPress() << " "
<< it.getDate() << " " << it.getPrice() << endl;
}
fout.close();
}
示例
在实现完上述类后,我们可以创建一个 main
函数来使用图书管理系统。
以下是添加一本图书的示例:
int main() {
Book book1(1, "C++ primer", "Lippman", "China Machine Press", "2022-01-01", 59.9);
BookRepository repository("books.txt");
repository.add(book1);
return 0;
}
以下是删除一本图书的示例:
int main() {
int bookId = 1;
BookRepository repository("books.txt");
repository.remove(bookId);
return 0;
}
以下是更新一本图书信息的示例:
int main() {
Book book1(1, "C++ primer", "Lippman", "China Machine Press", "2022-01-01", 59.9);
BookRepository repository("books.txt");
repository.modify(book1);
return 0;
}
以下是查询一本图书的示例:
int main() {
int bookId = 1;
BookRepository repository("books.txt");
Book* book = repository.find(bookId);
if (book != nullptr) {
book->printBook();
}
return 0;
}
以下是显示所有图书信息的示例:
int main() {
BookRepository repository("books.txt");
repository.listAllBooks();
return 0;
}
总结
本文中,我们介绍了如何使用 C++ 和文件操作来实现一个图书管理系统。通过定义一个 Book
类和 BookRepository
类,我们可以实现图书的添加、删除、修改和查询、查看所有图书信息等操作,同时保证数据的持久化和随时可用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现图书管理系统(文件操作与类) - Python技术站