You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:05:34