如何修改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
相关产品推荐
相关产品推荐

