📚 任务背景
魔法学院的图书馆遭遇混沌魔法袭击!图书信息全部混乱,借阅记录消失。用 C++ 打造一个图书管理系统,掌握结构体和文件操作,恢复图书馆秩序!
🧠 语法知识:新魔法技能
技能 1️⃣:结构体 —— 图书信息容器
struct Book {
string title; // 书名
string author; // 作者
string ISBN; // 国际标准书号
int stock; // 库存数量
};
Book library[1000]; // 最多存储1000本图书
技能 2️⃣:文件操作 —— 数据持久化
#include <fstream>
// 保存数据到文件(魔法书卷)
void saveToFile(Book arr[], int size) {
ofstream outFile("library_data.txt");
for(int i=0; i<size; i++) {
outFile << arr[i].title << ","
<< arr[i].author << ","
<< arr[i].ISBN << ","
<< arr[i].stock << "\n";
}
outFile.close();
}
// 从文件加载数据
void loadFromFile(Book arr[], int &size) {
ifstream inFile("library_data.txt");
string line;
size = 0;
while(getline(inFile, line)) {
// 解析逗号分隔的数据
// (实际开发建议使用更安全的解析方式)
arr[size].title = line.substr(0, line.find(','));
// ...类似处理其他字段...
size++;
}
inFile.close();
}
💻 代码实战:六大核心功能
第 1 步:系统框架搭建
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct Book { /* 结构体定义同上 */ };
Book library[1000]; // 图书数据库
int bookCount = 0; // 当前图书数量
// 功能函数声明
void addBook();
void displayBooks();
void borrowBook();
void returnBook();
void searchBook();
void saveAndExit();
int main() {
loadFromFile(library, bookCount); // 启动时加载数据
while(true) {
cout << "\n===== 魔法图书馆系统 =====";
cout << "\n1. 添加新书\n2. 显示所有书\n3. 借书\n4. 还书\n5. 搜索\n6. 保存退出\n选择: ";
int choice;
cin >> choice;
switch(choice) {
case 1: addBook(); break;
case 2: displayBooks(); break;
case 3: borrowBook(); break;
case 4: returnBook(); break;
case 5: searchBook(); break;
case 6: saveAndExit(); return 0;
default: cout << "无效选择!\n";
}
}
}
第 2 步:核心功能实现
添加图书
void addBook() {
if(bookCount >= 1000) {
cout << "⚠️ 图书馆已满!\n";
return;
}
Book newBook;
cout << "输入书名: ";
cin.ignore(); // 清除输入缓冲区
getline(cin, newBook.title);
cout << "输入作者: ";
getline(cin, newBook.author);
// ISBN校验(简化版)
bool isDuplicate;
do {
isDuplicate = false;
cout << "输入ISBN(13位数字): ";
cin >> newBook.ISBN;
// 检查重复
for(int i=0; i<bookCount; i++) {
if(library[i].ISBN == newBook.ISBN) {
cout << "⚠️ ISBN已存在!\n";
isDuplicate = true;
break;
}
}
} while(newBook.ISBN.length()!=13 || isDuplicate);
cout << "输入库存数量: ";
cin >> newBook.stock;
library[bookCount++] = newBook;
cout << "✨ 新书已上架!\n";
}
借书功能
void borrowBook() {
string targetISBN;
cout << "输入要借阅的ISBN: ";
cin >> targetISBN;
for(int i=0; i<bookCount; i++) {
if(library[i].ISBN == targetISBN) {
if(library[i].stock > 0) {
library[i].stock--;
cout << "成功借阅《" << library[i].title << "》\n";
return;
} else {
cout << "⚠️ 库存不足!\n";
return;
}
}
}
cout << "⚠️ 未找到该书籍!\n";
}
💡 知识加油站
- 结构体 vs 类:结构体默认成员为public,适合简单数据聚合
- 文件安全:实际开发建议:
- 使用
getline配合字符串流解析数据 - 添加文件打开失败检测
- 使用二进制文件存储敏感数据
- 使用
💣 挑战任务:扩展系统功能
1. 借阅记录系统
struct BorrowRecord {
string ISBN;
string borrowerName;
string borrowDate;
};
2. 逾期计算
根据借阅日期计算是否超期
3. 模糊搜索
实现按书名/作者的关键词搜索
4. 数据加密
使用简单加密算法(如字符ASCII偏移)保护文件数据
示例:模糊搜索
void searchBook() {
string keyword;
cout << "输入搜索关键词: ";
cin.ignore();
getline(cin, keyword);
bool found = false;
for(int i=0; i<bookCount; i++) {
if(library[i].title.find(keyword) != string::npos ||
library[i].author.find(keyword) != string::npos) {
cout << "《" << library[i].title << "》"
<< " 作者: " << library[i].author
<< " 库存: " << library[i].stock << "\n";
found = true;
}
}
if(!found) cout << "未找到相关书籍\n";
}
📚 练习题:图书馆升级计划
- 实现图书分类系统(科幻/文学/历史等)
- 添加用户登录系统(管理员/普通用户)
- 开发图书推荐功能(根据借阅历史推荐)
- 可视化借阅热度排行榜
🚀 下集预告:Level 5 幻兽养成系统
- 使用类与对象管理幻兽!
- 继承机制实现幻兽进化!
- 多态魔法展现特殊技能!
魔法调试提示:
- 遇到文件读取问题?试试绝对路径
"/Users/你的名字/Desktop/library_data.txt" - 在评论区喊“知识就是力量!”,获取结构体使用技巧!
通过本关,你已掌握结构体和文件操作两大核心技能!晒出你的「图书馆系统运行截图」,即可获得幻兽培养系统的入场券! 🦄✨