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

如何修改C语言车辆添加程序,限制最多存储5辆车辆信息?

实现车辆信息添加的数量限制(最多5辆)

问题描述

需实现向文件添加车辆信息时最多添加5辆,超过则提示「注册表已满」,现有add_vehicle函数代码如下,不清楚用while循环还是if语句实现该限制,寻求技术指导。

原代码:

void add_vehicle(){
   
    char another;
    FILE *fp;
    int n,i;
    struct vehicle info;
    do{
   
        printf("\t\t\t\t=======Add vehicle Info=======\n\n\n"); 
        fp=fopen("information.txt","a"); 
         
        printf("\n\t\t\tEnter Owner name :");
       
        scanf("%s",info.owner);
        
        printf("\n\t\t\tEnter vehicle-No :");
        scanf("%d",&info.car_no);
     
        printf("\n\t\t\tEnter age : ");
        scanf("%d",&info.age);
        
        printf("\n\t\t\tEnter vehicle type : ");
        
        scanf("%s",info.car_type);
        printf("\n\t\t\tEnter vehicle mark : ");
       
        scanf("%s",info.car_mark);
        printf("\n\t\t\tEnter registration nummber : ");
       
        scanf("%s",info.car_registration);
        
        printf("\n\t\t\t______________________________\n");
       
    if(fp==NULL){
        fprintf(stderr,"can't open file");
    }
    else{
        printf("\t\t\tRecord stored successfuly\n");
    }
    
    fwrite(&info, sizeof(struct vehicle), 1, fp); 
    
    fclose(fp);
    
}

实现方案

要实现最多添加5辆的限制,必须结合计数变量、条件判断(if)和循环控制(do-while/while),单独使用其中一个无法完成需求,具体实现步骤如下:

1. 核心逻辑

  • 先统计文件中已有的车辆记录数量
  • 每次进入添加流程前,用if判断当前总记录数是否已达5:
    • 若已达上限,直接提示「注册表已满」并终止添加
    • 若未达上限,允许用户输入信息并写入文件
  • 用do-while循环控制用户是否继续添加下一辆车,同时结合计数限制确保总数不超5

2. 修正后的完整代码

#include <stdio.h>
#include <stdlib.h>

// 假设struct vehicle的定义如下(请根据实际情况调整)
struct vehicle {
    char owner[50];
    int car_no;
    int age;
    char car_type[20];
    char car_mark[20];
    char car_registration[20];
};

void add_vehicle(){
    char another;
    FILE *fp;
    int count = 0;
    struct vehicle info;

    // 第一步:统计文件中已有的记录数
    fp = fopen("information.txt", "rb");
    if (fp != NULL) {
        fseek(fp, 0, SEEK_END);
        long file_size = ftell(fp);
        // 总记录数 = 文件总大小 / 单条记录的字节数
        count = file_size / sizeof(struct vehicle);
        fclose(fp);
    }

    do {
        // 每次添加前判断是否已达上限
        if (count >= 5) {
            printf("\t\t\t注册表已满,无法添加更多车辆信息\n");
            break;
        }

        printf("\t\t\t\t=======Add vehicle Info=======\n\n\n"); 
        // 以二进制追加模式打开文件,避免文本模式的格式问题
        fp = fopen("information.txt", "ab"); 
        if (fp == NULL) {
            fprintf(stderr, "can't open file");
            return;
        }

        printf("\n\t\t\tEnter Owner name :");
        scanf("%s", info.owner);
        
        printf("\n\t\t\tEnter vehicle-No :");
        scanf("%d", &info.car_no);
     
        printf("\n\t\t\tEnter age : ");
        scanf("%d", &info.age);
        
        printf("\n\t\t\tEnter vehicle type : ");
        scanf("%s", info.car_type);
        
        printf("\n\t\t\tEnter vehicle mark : ");
        scanf("%s", info.car_mark);
        
        printf("\n\t\t\tEnter registration number : ");
        scanf("%s", info.car_registration);
        
        printf("\n\t\t\t______________________________\n");

        // 写入记录并更新计数
        fwrite(&info, sizeof(struct vehicle), 1, fp); 
        printf("\t\t\tRecord stored successfully\n");
        count++;

        fclose(fp);

        // 询问用户是否继续添加
        printf("\t\t\tDo you want to add another record? (y/n): ");
        scanf(" %c", &another); // 空格用于跳过输入缓冲区的换行符
    } while (another == 'y' || another == 'Y');
}

3. 关键细节说明

  • 计数准确性:通过读取文件总大小除以单条struct vehicle的字节数,得到已有记录数,这种方式比逐行读取更高效
  • 条件判断(if)的作用:拦截超过上限的添加请求,直接给出提示
  • 循环控制(do-while)的作用:允许用户选择是否继续添加,同时在每次循环中检查计数限制
  • 原代码修复:补全了缺失的do-while循环条件,将fwrite放在文件打开成功的分支中,避免空指针访问崩溃

内容的提问来源于stack exchange,提问作者jahan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:55:09