C++实现图书管理系统(文件操作与类)

yizhihongxing

C++ 实现图书管理系统(文件操作与类)

背景

现在很多图书馆、书店、个人的藏书、电子图书馆等都需要一个可以管理图书的系统,对于这样的需求,我们可以使用 C++ 语言来实现。

本文将会介绍如何使用 C++ 实现一个图书管理系统,并使用文件操作和面向对象的方式来进行数据保存和管理。

思路

我们需要实现一个图书管理系统,这个系统应该包含以下功能:

  • 添加图书
  • 删除图书
  • 修改图书信息
  • 查询图书
  • 显示图书信息

我们可以使用一个名为 Book 的类来表示书籍,类中包含以下属性:

  • 书籍编号
  • 书籍名称
  • 作者
  • 出版社
  • 出版日期
  • 价格

图书管理系统可以使用一个 BookRepository 类来管理 Book 类的对象,这个类应该包含以下功能:

  • 添加书籍
  • 删除书籍
  • 修改书籍信息
  • 查询书籍
  • 显示所有书籍信息

同时,我们需要使用文件操作来保存和读取数据,这样可以保证数据的持久化和随时可用。

文件操作

在 C++ 中,我们可以使用 fstream 来进行文件操作,其中 fstream 包括 ifstreamofstream,分别表示读和写操作。

我们可以使用 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 &it;
        }
    }
    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技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • 逍遥自在学C语言 | 条件控制的正确使用姿势

    前言 在C语言中,有三种条件判断结构:if语句、if-else语句和switch语句。 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、if语句 基本语法 if (条件) { // 代码块1 } 代码示例 #include <stdio.h> int mai…

    C 2023年5月9日
    00
  • C语言中字符串库函数的实现及模拟

    C语言中字符串库函数的实现及模拟攻略 1. 字符串函数简介 C语言中的字符串函数是用来处理字符串的函数库,其中包含了很多有用的函数,例如字符串复制函数strcpy、字符串拼接函数strcat、字符串比较函数strcmp等等,这些函数使得字符串的处理变得更加简单、高效和方便。 2. C语言中字符串函数的实现 下面是几个常用的字符串函数的实现方法。 2.1 st…

    C 2023年5月23日
    00
  • js JSON.stringify()基础详解

    js JSON.stringify()基础详解 在JavaScript中,JSON.stringify()方法可以将JavaScript对象转换为JSON字符串。 方法语法 JSON.stringify(value[, replacer[, space]]) value: 要转换成 JSON 字符串的 JavaScript 对象或数组。 replacer(可…

    C 2023年5月23日
    00
  • json2.js 入门教程之使用方法与实例分析

    JSON2.js 入门教程之使用方法与实例分析 什么是JSON2.js? JSON2.js是一个JavaScript库,旨在提供JSON对象的Polyfill,使得旧版浏览器支持JSON.stringify()和JSON.parse()方法。JSON2.js源于Douglas Crockford的json2.js(http://www.JSON.org/js…

    C 2023年5月23日
    00
  • C语言中打印特殊图案的实现代码

    下面是详细讲解“C语言中打印特殊图案的实现代码”的完整攻略。 1. 基本概念 在C语言中,我们可以通过使用转义字符来实现打印特殊字符或图案的功能。转义字符是以反斜杠(\)开头的一种特殊字符,它们表示某些无法输入的字符,如换行符、制表符、回车符等。 2. 实现代码 2.1 示例一:打印三角形 以下代码可以打印一个由星号组成的三角形,可以通过连续打印多行来实现。…

    C 2023年5月24日
    00
  • Java EE项目中的异常处理总结(一篇不得不看的文章)

    以下是我对《Java EE项目中的异常处理总结(一篇不得不看的文章)》这篇文章的完整攻略: 文章概述 文章主要分为四个部分:异常处理的基本概念、Java中的异常处理机制、Java EE项目中的异常处理、异常处理的最佳实践等。其中,第一个部分主要介绍了异常处理的基本概念,包括异常的定义、分类、抛出和捕获等。第二个部分则详细讲解了Java中的异常处理机制,包括t…

    C 2023年5月23日
    00
  • 详解 linux c++的编译器g++的基本使用

    详解 Linux C++ 的编译器 g++ 基本使用 什么是 g++? g++ 是 Linux 上的一个 C++ 编译器,是 GNU Compiler Collection(简称 GCC)的组成部分之一。 安装 g++ 在 Linux 下,一般默认已经安装了 g++,可以通过以下命令检查是否已安装 g++: g++ –version 如果没有安装,可以通过…

    C 2023年5月23日
    00
  • Java多态实现原理详细梳理总结

    Java多态实现原理详细梳理总结 多态是面向对象编程(Object-Oriented Programming)中的一种重要特性。Java以及其他面向对象语言,利用多态性来提高代码的重用性、可维护性、可读性和可扩展性。Java多态实现原理包括以下几个方面: 动态绑定(Dynamic Binding):在多态场景下,相同的方法会根据对象的类型产生不同的结果。这是…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部