C语言编译(6)修改功能:可根据查询结果对相应的记录进行修改,修改时注意车牌号的唯一性。
时间: 2024-02-15 21:03:10 浏览: 164
在修改车牌号的时候,需要避免车牌号重复的情况。可以采用如下算法:
1. 提示用户输入要修改的车牌号
2. 在车辆信息文件中查找该车牌号对应的记录,如果找到了,就输出该记录的详细信息并提示用户输入修改后的信息
3. 如果用户修改了车牌号,需要判断修改后的车牌号是否已经存在,如果存在,则提示用户重新输入,直到输入一个不存在的车牌号为止
4. 将修改后的信息写入车辆信息文件中,更新车辆信息
下面是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_RECORDS 1000
#define MAX_LINE_LENGTH 1024
struct Car {
char plate[10];
char brand[20];
char model[20];
int year;
int mileage;
};
struct Car cars[MAX_RECORDS];
int num_cars = 0;
// 读取车辆信息文件
void read_cars(const char *filename) {
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("Error: cannot open file %s\n", filename);
exit(1);
}
char line[MAX_LINE_LENGTH];
while (fgets(line, MAX_LINE_LENGTH, fp)) {
char *token;
token = strtok(line, ",");
strcpy(cars[num_cars].plate, token);
token = strtok(NULL, ",");
strcpy(cars[num_cars].brand, token);
token = strtok(NULL, ",");
strcpy(cars[num_cars].model, token);
token = strtok(NULL, ",");
cars[num_cars].year = atoi(token);
token = strtok(NULL, ",");
cars[num_cars].mileage = atoi(token);
num_cars++;
}
fclose(fp);
}
// 写入车辆信息文件
void write_cars(const char *filename) {
FILE *fp = fopen(filename, "w");
if (fp == NULL) {
printf("Error: cannot open file %s\n", filename);
exit(1);
}
for (int i = 0; i < num_cars; i++) {
fprintf(fp, "%s,%s,%s,%d,%d\n", cars[i].plate, cars[i].brand, cars[i].model, cars[i].year, cars[i].mileage);
}
fclose(fp);
}
// 查找车辆信息
int find_car(const char *plate) {
for (int i = 0; i < num_cars; i++) {
if (strcmp(cars[i].plate, plate) == 0) {
return i;
}
}
return -1;
}
// 修改车辆信息
void modify_car() {
char plate[10];
printf("Enter the plate number of the car to modify: ");
scanf("%s", plate);
int index = find_car(plate);
if (index == -1) {
printf("Error: car not found\n");
return;
}
struct Car car = cars[index];
printf("Current car information:\n");
printf("Plate number: %s\n", car.plate);
printf("Brand: %s\n", car.brand);
printf("Model: %s\n", car.model);
printf("Year: %d\n", car.year);
printf("Mileage: %d\n", car.mileage);
struct Car new_car;
printf("Enter new plate number (or press Enter to skip): ");
fgets(new_car.plate, 10, stdin);
if (new_car.plate[0] != '\n') {
// 用户输入了新的车牌号
new_car.plate[strlen(new_car.plate) - 1] = '\0';
if (find_car(new_car.plate) != -1) {
printf("Error: plate number already exists\n");
return;
}
} else {
strcpy(new_car.plate, car.plate);
}
printf("Enter new brand (or press Enter to skip): ");
fgets(new_car.brand, 20, stdin);
if (new_car.brand[0] != '\n') {
new_car.brand[strlen(new_car.brand) - 1] = '\0';
} else {
strcpy(new_car.brand, car.brand);
}
printf("Enter new model (or press Enter to skip): ");
fgets(new_car.model, 20, stdin);
if (new_car.model[0] != '\n') {
new_car.model[strlen(new_car.model) - 1] = '\0';
} else {
strcpy(new_car.model, car.model);
}
printf("Enter new year (or press Enter to skip): ");
char year_str[10];
fgets(year_str, 10, stdin);
if (year_str[0] != '\n') {
new_car.year = atoi(year_str);
} else {
new_car.year = car.year;
}
printf("Enter new mileage (or press Enter to skip): ");
char mileage_str[10];
fgets(mileage_str, 10, stdin);
if (mileage_str[0] != '\n') {
new_car.mileage = atoi(mileage_str);
} else {
new_car.mileage = car.mileage;
}
cars[index] = new_car;
printf("Car information updated.\n");
}
int main() {
read_cars("cars.txt");
modify_car();
write_cars("cars.txt");
return 0;
}
```
在上面的代码中,我们首先定义了一个结构体`struct Car`,用于存储车辆信息。然后定义了一个全局数组`cars`,用于存储所有的车辆信息。`num_cars`表示当前已经记录的车辆数量。
`read_cars`函数用于读取车辆信息文件。`write_cars`函数用于写入车辆信息文件。`find_car`函数用于查找车辆信息。`modify_car`函数用于修改车辆信息。
在`modify_car`函数中,我们首先提示用户输入要修改的车牌号。然后使用`find_car`函数查找该车牌号对应的记录。如果找到了,就输出该记录的详细信息,并提示用户输入修改后的信息。在输入新的车牌号时,我们需要判断是否已经存在,如果存在则需要重新输入。
最后,我们将修改后的信息写入车辆信息文件中,并输出提示信息。
注意,这里的文件格式为CSV格式,即逗号分隔的文本文件。每行记录包含车牌号、品牌、型号、年份和里程数,用逗号分隔。在读取和写入文件时,我们使用`fgets`和`fprintf`函数来读取和写入文本行。在输入字符串时,我们使用`fgets`函数来避免缓冲区溢出的问题。
阅读全文