我正在编写一个程序,它接受一个文件输入并将其保存到数组中。问题是我不确定是否应该使用2D数组。特别是我听说的
输入文件:
!feof
循环可能不是正确的做法。我还需要找出city_mpg和highway_mpg的平均值,然后将其添加到数组中作为另一列。添加列后,我需要按升序排序。如果它是一个1D数组,我该如何找到平均值并将其添加到另一列?如果是2D的,我可以指定[1][4]
和[1][5]
然后执行这样的操作,然后将其保存为[1][6]
等等,还是应该坚持使用Malloc?输入文件:
Mercury Sable 2009 18 28
Jeep Wrangler 2016 17 21
Honda civic 2015 31 41
Toyota Corolla 2015 30 42
Toyta Prius 2010 51 48
Ford Escape 2013 23 33
Ford Fusion 2013 25 37
Acura MDX 2014 20 28
Lexus RX 2013 32 28
程序不完整:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CARS 1000 //no more than 1000 cars
#define MAX_STR 30 //str wont be longer than 30
struct car { // declare my structure
char *make; // pointers for char and declares my vars
char *model;
int manufacture_year;
int city_mpg;
int highway_mpg;
int average_mpg;
};
//sorts array based on average mpg here
int main(void) { //main function
int cars = 0;
int c;
struct car *data;
char make[MAX_STR+1]; //char will be 30 + 1 for null char
char model[MAX_STR+1];
int year, city, highway; //declares ints
FILE *file; //declares input file
FILE *file2; //declares output file
file = fopen("cars.txt", "r"); //opens car.txt as read
if(file == NULL) { //if file is null
printf("File error\n"); //throws error
return 1;
}
data = malloc(MAX_CARS * sizeof(struct car)); //allocates memory for array by max cars for pointers
if(data == NULL) {
printf("Memory error\n"); //error if memory is a issue just incase mainly used for testing
return 1;
}
while(fscanf(file, "%30s %30s %d %d %d", make, model, &year, &city, &highway) == 5) { //reads the data with a while loop
if(cars >= MAX_CARS) { //just a check if file is more than 1k
printf("Too many cars\n"); //outputs result if too many cars
break;
}
data[cars].make = strdup(make); // makes a copy of the strings
data[cars].model = strdup(model);
data[cars].manufacture_year = year; // copies the data so that it is headed properly
data[cars].city_mpg = city; // copies the data so that it is headed properly
data[cars].highway_mpg = highway; // copies the data so that it is headed properly
data[cars].average_mpg = (city + highway) / 2; //gets the average mpg
cars++; // loop counter
}
fclose(file); //closes file
file2 = fopen("sorted_cars.txt", "a+"); //opens new file or creates one if there isnt one
fprintf(file2,"Make Model Year City mpg Highway mpg Average mpg\n"); //prints to new txt file
for(c=0; c<cars; c++) {
sprintf(model, "%s %s", data[c].make, data[c].model); //sprintf sends formatted output to a string
fprintf(file2,"%-20s %4d %4d %4d %4d\n", model, data[c].manufacture_year,data[c].city_mpg, data[c].highway_mpg, data[c].average_mpg); //prints to oufile
}
// free the memory, It tries to allocate enough memory to hold the old string (plus a null character to mark the end of the string)
while(--cars >= 0) {
free(data[cars].model);
free(data[cars].make);
}
free(data); //frees the array memory
return 0;
}
期望结果:
Make Model year city mpg highway mpg average mpg
Jeep Wrangler 2016 17 21 19
Mercury Sable 2009 18 28 23
and so on...
feof
:while(fscanf(file, "%s %s %d %d %d", ...) == 5) {...}
,而且你必须始终检查scanf
系列调用的返回值。 - Weather Vane