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日

相关文章

  • C语言深入讲解宏的定义与使用方法

    C语言深入讲解宏的定义与使用方法 什么是宏 宏是一种简单的文本替换机制,在编译时进行替换。通常,宏定义使用#define关键字进行定义,在本文中,我们将深入探讨宏的定义与使用方法。 宏的定义方式 宏的定义方式非常简单,使用#define关键字即可,语法如下: #define 宏名 宏值 其中,宏名是需要定义的宏的名称,宏值是需要定义的宏的值,可以是一个常量、…

    C 2023年5月23日
    00
  • c语言clock函数使用示例

    C语言Clock函数使用示例 Clock函数介绍 clock()是C语言标准库中的一个函数,其函数原型为:clock_t clock(void);。该函数通常用于计算程序运行的时间,单位为时钟周期(clock tick),可以通过除以CLOCKS_PER_SEC转换成秒。 需要注意的是,clock()函数返回的是程序自进程开始运行时起累计的时钟周期数,并不是…

    C 2023年5月23日
    00
  • C语言用函数指针实现一个特别的计算器

    C语言用函数指针实现一个特别的计算器 1. 什么是函数指针 在C语言中,函数指针是指向函数的指针变量,也就是说,函数指针存储的是一个函数的地址。通过函数指针,我们可以直接调用该函数,就像调用普通变量一样,这样可以使程序更加灵活。 定义一个函数指针需要注意两点:- 函数指针的声明方式与普通指针有所不同,其声明格式为 返回类型 (*指针变量名)(参数列表);- …

    C 2023年5月23日
    00
  • C语言多线程开发中死锁与读写锁问题详解

    C语言多线程开发中死锁与读写锁问题详解 介绍 多线程程序在共享资源的情况下容易产生各种问题。常见的问题之一是死锁和读写锁问题。本文将详细探讨这两个问题,并提供示例程序来阐述这些问题以及如何避免它们。读者需要有一定的C语言和多线程编程的基础知识。 死锁 当两个或多个线程同时尝试锁定一组资源,但是由于彼此依赖,从而导致其中一个线程等待的情况,这种情况叫做死锁。死…

    C 2023年5月23日
    00
  • C语言实现求解素数的N种方法总结

    C语言实现求解素数的N种方法总结 简介 本文将总结C语言实现求解素数的N种方法。素数是只能被1和本身整除的正整数,对于计算机编程而言,求解素数是一个常见的问题。本文将介绍7种解决大约从100以内寻找素数至大约1百万以内寻找素数的方法。 方法一:暴力枚举 对于一个数n,从2开始枚举到sqrt(n)为止,判断n是否能被2~sqrt(n)中的任一数整除。如果n不能…

    C 2023年5月22日
    00
  • Visual C++ 常用数据类型转换方法详解第1/2页

    标题部分 Visual C++ 常用数据类型转换方法详解 简介部分 在开发过程中,常常需要进行数据类型转换,比如int类型转换为string类型、string类型转换为double类型等。Visual C++ 提供了丰富的数据类型转换方法,本文将详细讲解常用的数据类型转换方法。 数据类型转换方法示例 将 int 类型转换为 string 类型 代码示例: i…

    C 2023年5月23日
    00
  • C语言执行时,程序控制台输出窗口 一闪而过问题及解决

    在使用C语言编写程序并在控制台中运行时,有时会遇到程序执行后控制台窗口一闪而过的情况,使得无法看到程序的输出结果。这种情况通常是由于程序执行完毕后,系统自动关闭控制台窗口所导致的。解决这个问题,可以采用以下两种方法。 方法一:调用“暂停”命令 使用该方法需要在程序执行完毕后,调用系统命令行窗口的“暂停”命令,从而保证程序执行结果能够停留在窗口中,直到用户手动…

    C 2023年5月23日
    00
  • C语言实现扫雷游戏(可展开)

    当然可以,以下是详细讲解“C语言实现扫雷游戏(可展开)”的完整攻略: 1. 确定游戏的基本规则 在开始编写程序之前,我们需要确定游戏的基本规则,包括地图大小、雷的数量和插旗操作等。以一个简单的扫雷游戏为例,我们可以设定: 地图大小:10*10; 雷的数量:10个; 插旗操作:如果玩家认为某个位置可能有雷,可以在该位置上插上一个旗帜。 2. 编写随机生成雷的函…

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