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

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日

相关文章

  • 详解Dijkstra算法原理及其C++实现

    详解Dijkstra算法原理及其C++实现 前言 Dijkstra算法是一种常见的求解单源最短路径的算法,本文将对其进行详细的讲解。 原理 Dijkstra算法的核心思想是贪心,即每次都选择当前最短路径上距离起点最近的顶点,并通过该顶点更新与其相邻的顶点的距离。Dijkstra算法使用一个数组dist[i]来记录起点到每个顶点的最短距离,同时使用一个visi…

    C 2023年5月22日
    00
  • Js的Array数组对象详解

    Js的Array数组对象详解 简介 在 JavaScript 中,Array 是一种重要的数据结构。简单来讲,数组就是一种存储一组数据的方式,这些数据可以是任意类型,包括数字、字符串、布尔值、对象等等。 而 Array 是一种对象,它是 JavaScript API 中自带的,具有一系列的方法和属性,可以方便地操作数组。 在本文中,我将详细介绍 Array …

    C 2023年5月23日
    00
  • Win7系统运行游戏应用程序报错0xc000007d无法正常启动

    问题描述: 在运行Win7系统中的某些游戏或应用程序时,出现了错误代码0xc000007d,导致无法正常启动。 解决方案: 确认系统与程序兼容性 首先,需要确认系统与待运行的游戏或应用程序之间的兼容性。Win7系统比较老旧,一些新的软件或应用需要更高版本的系统支持。可以查看软件或应用程序的官方网站,查看其支持的最低操作系统版本。如果程序不兼容,将无法运行。如…

    C 2023年5月24日
    00
  • C语言实现文件读写

    文件读写是C语言的一个重要部分,文件读写操作主要是通过函数库提供的各种操作文件的函数来实现的。在实现文件读写时,主要分为以下几个步骤: 打开文件 C语言提供了fopen函数来打开文件,并返回一个指向文件的指针,该函数原型如下: FILE *fopen(const char *filename, const char *mode); 其中,filename表示…

    C 2023年5月23日
    00
  • 比特币真的值得长期持有和投资吗一文弄懂

    “比特币真的值得长期持有和投资吗” 完整攻略 1. 什么是比特币? 比特币是一种基于区块链技术的加密数字货币,由匿名的发明者“中本聪”在2009年发布。比特币的交易和管理是通过去中心化的方式进行,独立于中央机构或政府控制。 2. 比特币的特点 2.1 去中心化 比特币的交易和管理不需要中央机构或政府控制,而是由全球网络的节点共同维护、管理。 2.2 匿名性 …

    C 2023年5月22日
    00
  • Android 跨进程SharedPreferences异常详解

    Android 跨进程SharedPreferences异常详解 在 Android 中,SharedPreferences 是一种轻量级的本地 Key-Value 存储方式,它非常方便用于存储小量的数据,例如用户的偏好设置。但是,在多进程的 Android 应用中,使用 SharedPreferences 可能会遇到跨进程异常问题,本文将详细讲解这个问题的…

    C 2023年5月23日
    00
  • 浅谈Linux环境下并发编程中C语言fork()函数的使用

    浅谈Linux环境下并发编程中C语言fork()函数的使用 简介 在Linux环境下C语言的并发编程中,fork()函数是一种常见的创建新进程的方式。这个函数会创建一个子进程,子进程与父进程在某些方面是相同的,在另一些方面又是不同的。本文将详细讲解fork()函数的使用。 fork()函数的声明 fork()函数的声明如下所示: #include <u…

    C 2023年5月22日
    00
  • C程序 检查一个数字是否可以表示为两个素数之和

    为了解决这个问题,可以采用“筛法”,即筛选素数,然后枚举其中的两个素数,判断它们的和是否等于给定的数字。 具体步骤如下: 先构造一个数组 marks,用于记录数字是否是素数。这里的实现用到了“埃氏筛法”。 int marks[MAX_N + 1]; // marks[i] 表示数字 i 是否为素数 memset(marks, 1, sizeof(marks)…

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