(硬件清单)假设你是一个硬件商店的老板,需要一个清单来告诉自己有哪些不同的工具、手头上每种工具有多少个及每个价格是多少。编写一个程序,使用100条空记录来初始化随机存取文件hdwm.dat,允许输入每个工具的数据,可以列出所有工具,可以删除一条不再需要的工具的记录并允许更新文件中的任何信息。使用工具识别号作为记录号。利用下面的信息作为文件的开始信息。 记录号 工具名称 数量 价格 3 Electric sander 7 57.98 17 Hammer 76 11.99 24 Jig saw 21 11.00 39 Lawn mower 3 79.50 56 Power saw 18 99.99 68 Screwdriver 106 6.99 77 Sledge hammer 0 21.50 83 Wrench 34 7.50 用C++写一段程序,完成上面的要求
时间: 2024-03-18 21:42:16 浏览: 114
很高兴为您解答这个问题,下面是C++的代码:
```c++
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>
using namespace std;
// 工具结构体
struct Tool {
char name[20]; // 工具名称
int num; // 数量
float price; // 价格
};
// 将工具写入文件
void writeTool(fstream& file, int pos, Tool tool) {
file.seekp(pos * sizeof(Tool)); // 定位记录位置
file.write(reinterpret_cast<char*>(&tool), sizeof(Tool)); // 写入数据
}
// 读取指定位置的工具
Tool readTool(fstream& file, int pos) {
Tool tool;
file.seekg(pos * sizeof(Tool)); // 定位记录位置
file.read(reinterpret_cast<char*>(&tool), sizeof(Tool)); // 读取数据
return tool;
}
// 显示所有工具
void displayAllTools(fstream& file) {
Tool tool;
file.clear(); // 清空文件状态
file.seekg(0); // 定位到文件开头
int pos = 0;
cout << left << setw(5) << "编号" << setw(20) << "名称" << setw(10) << "数量" << setw(10) << "价格" << endl;
while (file.read(reinterpret_cast<char*>(&tool), sizeof(Tool))) {
if (strlen(tool.name) > 0) {
cout << left << setw(5) << pos << setw(20) << tool.name << setw(10) << tool.num << setw(10) << tool.price << endl;
}
pos++;
}
}
// 添加一个新工具
void addTool(fstream& file) {
Tool tool;
cout << "请依次输入工具名称、数量、价格:" << endl;
cin >> tool.name >> tool.num >> tool.price;
writeTool(file, file.tellp() / sizeof(Tool), tool); // 写入文件
cout << "添加成功!" << endl;
}
// 根据编号查找工具
int findTool(fstream& file, int pos) {
Tool tool = readTool(file, pos);
if (strlen(tool.name) == 0) {
return -1; // 已删除的记录
} else {
return pos;
}
}
// 删除一条工具记录
void deleteTool(fstream& file) {
int pos;
cout << "请输入要删除的工具编号:" << endl;
cin >> pos;
pos = findTool(file, pos);
if (pos == -1) {
cout << "没有找到该工具!" << endl;
} else {
Tool tool;
memset(&tool, 0, sizeof(Tool)); // 将该记录清空
writeTool(file, pos, tool);
cout << "删除成功!" << endl;
}
}
// 更新一条工具记录
void updateTool(fstream& file) {
int pos;
cout << "请输入要更新的工具编号:" << endl;
cin >> pos;
pos = findTool(file, pos);
if (pos == -1) {
cout << "没有找到该工具!" << endl;
} else {
Tool tool = readTool(file, pos);
cout << "当前工具信息:" << endl;
cout << left << setw(5) << pos << setw(20) << tool.name << setw(10) << tool.num << setw(10) << tool.price << endl;
cout << "请依次输入新的工具名称、数量、价格:" << endl;
cin >> tool.name >> tool.num >> tool.price;
writeTool(file, pos, tool);
cout << "更新成功!" << endl;
}
}
// 主函数
int main() {
const char* filePath = "hdwm.dat";
fstream file(filePath, ios::in | ios::out | ios::binary); // 打开文件流
if (!file) {
cerr << "无法打开文件!" << endl;
return 1;
}
// 初始化文件
Tool tool = {"", 0, 0};
for (int i = 0; i < 100; i++) {
writeTool(file, i, tool);
}
// 插入初始数据
tool = {"Electric sander", 7, 57.98};
writeTool(file, 3, tool);
tool = {"Hammer", 76, 11.99};
writeTool(file, 17, tool);
tool = {"Jig saw", 21, 11.00};
writeTool(file, 24, tool);
tool = {"Lawn mower", 3, 79.50};
writeTool(file, 39, tool);
tool = {"Power saw", 18, 99.99};
writeTool(file, 56, tool);
tool = {"Screwdriver", 106, 6.99};
writeTool(file, 68, tool);
tool = {"Sledge hammer", 0, 21.50};
writeTool(file, 77, tool);
tool = {"Wrench", 34, 7.50};
writeTool(file, 83, tool);
// 显示菜单
int choice;
while (true) {
cout << "请选择操作:\n1. 显示所有工具\n2. 添加一个新工具\n3. 删除一条工具记录\n4. 更新一条工具记录\n5. 退出" << endl;
cin >> choice;
switch (choice) {
case 1:
displayAllTools(file);
break;
case 2:
addTool(file);
break;
case 3:
deleteTool(file);
break;
case 4:
updateTool(file);
break;
case 5:
file.close();
return 0;
default:
cout << "无效的选项,请重新输入!" << endl;
break;
}
}
}
```
这个程序实现了初始化文件、插入初始数据、显示所有工具、添加一个新工具、删除一条工具记录和更新一条工具记录等功能。在程序运行时,会显示一个菜单,用户可以根据自己的需求选择相应的操作。
阅读全文