整个目标是创建具有以下属性的生成1000辆汽车,将它们写入二进制文件,从该二进制文件中读取它们并对它们进行计数.请注意,如果汽车是混合动力车,那么它将有两个效率,一个是浮点型,另一个是整型.下面的代码是因为我在上面花了太多的时间(现在已经两天了).
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <process.h>
typedef enum {
hybrid, ICE, electric
} engine_Type;
typedef enum {
tesla, bmw, toyota, mercedes_benz, hyundai, volkswagen, nissan
} car_Make;
typedef union {
int electricEffInt;
float iceEffFloat;
} effincy;
typedef struct {
engine_Type engine;
car_Make make;
int hybridEffInt;
float hybridEffFloat;
effincy carEfficiency;
int maximumTorque;
} car;
//Mix is used for seed generation
unsigned long mix(unsigned long a, unsigned long b, unsigned long c) {
a=a-b; a=a-c; a=a^(c >> 13);
b=b-c; b=b-a; b=b^(a << 8);
c=c-a; c=c-b; c=c^(b >> 13);
a=a-b; a=a-c; a=a^(c >> 12);
b=b-c; b=b-a; b=b^(a << 16);
c=c-a; c=c-b; c=c^(b >> 5);
a=a-b; a=a-c; a=a^(c >> 3);
b=b-c; b=b-a; b=b^(a << 10);
c=c-a; c=c-b; c=c^(b >> 15);
return c;
}
car carGeneration() {
car car;
car.engine = rand()%3;
car.make = rand()%7;
car.maximumTorque = (250 + rand()/(RAND_MAX/(3800-250)));
switch (car.engine) {
case hybrid: car.hybridEffInt = (12 + rand() / (RAND_MAX / (18 - 12)));
car.hybridEffFloat = (float)(3.3f + (float)rand() / (RAND_MAX / (8.5f - 3.3f)));
break;
case ICE: car.carEfficiency.iceEffFloat= (3.3f + (float)rand() / (RAND_MAX / (8.5f - 3.3f)));
break;
case electric: car.carEfficiency.electricEffInt = (12 + rand() / (RAND_MAX / (18 - 12)));
break;
}
return car;
}
void mulipleCarGeneartion(int carCount, car *cars){
for(int i =0;i < carCount ;i++){
cars[i]=carGeneration();
}
}
void write_file(car *cars, int amount){
FILE*out = fopen("cars.dat", "wb");
if(out == NULL){
printf("File does not exist creating file");
}
for (int i=0;i< amount ;i++) {
//fwrite(&cars[i], sizeof(car) , 1,out);
fwrite(&cars[i].engine, sizeof(car) , 1,out);
fwrite(&cars[i].make, sizeof(car) , 1,out);
fwrite(&cars[i].maximumTorque, sizeof(int) , 1,out);
switch (cars[i].engine) {
case hybrid: fwrite(&cars[i].hybridEffInt, sizeof(int) , 1,out);
fwrite(&cars[i].hybridEffFloat, sizeof(float) , 1,out);
break;
case ICE:
fwrite(&cars[i].carEfficiency.iceEffFloat, sizeof(float) , 1,out);
break;
case electric:fwrite(&cars[i].carEfficiency.electricEffInt, sizeof(int) , 1,out);
break;
}
}
fclose(out);
}
void read_file(car *cars, int amount) {
int teslaCount = 0, bmwCount=0, toyotaCount=0, mercedes_BenzCount=0, hyundaiCount=0, volkswagenCount=0, nissanCount=0;
FILE *in = fopen("cars.dat", "rb");
if (in == NULL) {
printf("Can not read file");
}
printf("Car makes (Quantity): \n");
printf("Tesla BMW Toyota Mercedes-Benz Volkswagen Nissan\n");
for (int j = 0; j<50; j++) {
printf("-");
}
printf("\n");
for (int i = 0; i < amount; i++) {
fread(&cars[i],sizeof(car), 1, in);
printf("engine Type: %d \n", cars[i].engine);
printf("car Make: %d \n", cars[i].make);
printf("Torque %d \n", cars[i].maximumTorque);
switch (cars[i].make) {
case tesla: teslaCount++;
break;
case bmw: bmwCount++;
break;
case toyota: toyotaCount++;
break;
case mercedes_benz: mercedes_BenzCount++;
break;
case hyundai: hyundaiCount++;
break;
case volkswagen: volkswagenCount++;
break;
case nissan: nissanCount++;
break;
}
switch (cars[i].engine) {
case hybrid:
printf("hybrid efficiencyINT: %d\n", cars[i].hybridEffInt);
printf("hybrid efficiencyFLOAT: %f\n", cars[i].hybridEffFloat);
break;
case ICE:
printf("ICE efficiency: %f\n", cars[i].carEfficiency.iceEffFloat);
break;
case electric:
printf("electric efficiency: %d\n", cars[i].carEfficiency.electricEffInt);
}
}
printf("Count bob %d %d %d %d %d %d", bmwCount, hyundaiCount,volkswagenCount,nissanCount, teslaCount, toyotaCount);
}
int main() {
int generationAmount = 20;
car carsArray[generationAmount];
mulipleCarGeneartion(generationAmount, carsArray);
srand(mix(clock(), time(NULL), getpid()));
write_file(carsArray, generationAmount);
read_file(carsArray,generationAmount);
return 0;
}
我首先调试并找到存储在数组中的值.现在问题似乎出在WRITE函数或READ函数上.我以为做fwrite(&cars[i].engine, sizeof(car) , 1,out));
会写下有关数组的所有内容,包括属性,但老实说,我不确定,因此我try 让多个fwrite
来写有关Car的所有内容,并在读取文件时以相同的顺序读取它们.我试着更改FWRITE内部的SIZOF,但都不起作用.
This is the current output:个
engine Type: 2
car Make: 1
Torque 953
electric efficiency: 16
engine Type: 1
car Make: 1363987785
Torque 2
ICE efficiency: 0.000000
engine Type: 953
car Make: 16
Torque 32760
engine Type: 17
car Make: 1525
Torque 17
engine Type: 1525
car Make: 1
Torque 6
Count bob 2 0 0 0 0 0
这是不正确的,汽车的范围是0-7,发动机类型是0-3,扭矩的最小值是250.使这个问题变得更难的是,我无法查看二进制文件并理解数据来查看问题所在.我知道我可以将它转换为十六进制,但我要用十六进制做什么?