C语言简易库存程序数据重置问题求助
解决C语言库存系统重启后数据重置的问题
你的问题核心是内存数据的临时性:你定义的inventory数组存在程序的栈内存里,程序运行结束后,这块内存会被系统回收,所有修改都会丢失——不管把数组放哪个函数里,只要没把数据写到磁盘上,下次启动肯定会回到初始值。
要让库存状态持久化,必须把数据存在文件里,程序启动时从文件读取,修改后再写回文件。下面是具体的修改方案:
关键修改点
- 新增两个函数:
load_inventory(从文件加载库存)和save_inventory(将库存保存到文件) - 程序启动时优先从文件加载库存,如果文件不存在,再用默认的三个物品初始化
- 每次修改库存(比如添加物品)后,立即保存到文件
修改后的完整代码
#include <stdio.h> #include <string.h> #define INVENTORY_SIZE 10 #define ITEM_LENGTH 10 #define INVENTORY_FILE "inventory.dat" // 从文件加载库存 void load_inventory(char inventory[INVENTORY_SIZE][ITEM_LENGTH]) { FILE *fp = fopen(INVENTORY_FILE, "rb"); if (fp == NULL) { // 文件不存在,用默认值初始化 strcpy(inventory[0], "Banana"); strcpy(inventory[1], "Axe"); strcpy(inventory[2], "Pepsi"); // 清空剩余槽位 for (int i = 3; i < INVENTORY_SIZE; i++) { inventory[i][0] = '\0'; } return; } // 读取整个库存数组 fread(inventory, sizeof(char), INVENTORY_SIZE * ITEM_LENGTH, fp); fclose(fp); } // 将库存保存到文件 void save_inventory(char inventory[INVENTORY_SIZE][ITEM_LENGTH]) { FILE *fp = fopen(INVENTORY_FILE, "wb"); if (fp == NULL) { printf("无法保存库存!\n"); return; } fwrite(inventory, sizeof(char), INVENTORY_SIZE * ITEM_LENGTH, fp); fclose(fp); } int main() { char inventory[INVENTORY_SIZE][ITEM_LENGTH]; // 启动时加载库存 load_inventory(inventory); unsigned int itemCount = INVENTORY_SIZE; // 计算可用槽位 unsigned int freeSpace = 0; for (size_t i = 0; i < itemCount; i++) { if (inventory[i][0] == '\0') { freeSpace++; } } printf("freeSpace = %u\n", freeSpace); unsigned int freeItemSlot = itemCount - freeSpace; int options; printf("What would you like to do? \n1 = Display inventory \n2 = Add an item to the inventory\n"); scanf("%d", &options); if (options == 1) { for(unsigned int i = 0; i < itemCount; i++) { if (inventory[i][0] != '\0') { // 只显示非空物品 printf("[%u]%s\n", i, inventory[i]); } } } if (options == 2) { if (freeSpace == 0) { printf("库存已满,无法添加新物品!\n"); return 0; } char newItem[ITEM_LENGTH]; printf("Which item would you like to add to your inventory? "); scanf("%s", newItem); // 确保物品长度不超过限制 if (strlen(newItem) >= ITEM_LENGTH) { printf("物品名称过长,最多9个字符!\n"); return 0; } strcpy(inventory[freeItemSlot], newItem); printf("You have added %s to your inventory.\n", newItem); // 保存修改后的库存 save_inventory(inventory); // 打印更新后的库存 for(unsigned int i = 0; i < itemCount; i++) { if (inventory[i][0] != '\0') { printf("[%u]%s\n", i, inventory[i]); } } } return 0; }
补充说明
- 程序会在当前目录生成一个名为
inventory.dat的二进制文件,用来存储库存数据 - 如果删除这个文件,程序会回到初始的三个物品状态
- 新增了库存满的判断和物品长度限制,避免数组越界问题
内容的提问来源于stack exchange,提问作者Peter Kirsch
相关产品推荐
相关产品推荐

