Ich schreibe ein Programm, das eine Dateieingabe übernimmt und in einem Array speichert. Das Problem ist, ich bin mir nicht ganz sicher, ob ich ein 2D-Array machen soll oder nicht. Insbesondere meine While-Schleife, die ich gehört habe !feof
ist wahrscheinlich nicht der Weg zu gehen. Ich muss auch den Durchschnitt von city_mpg und highway_mpg herausfinden und dann das Array als eine andere Spalte hinzufügen. Nachdem die Spalte hinzugefügt wurde, muss ich sie aufsteigend sortieren. Wie würde ich die Durchschnittswerte finden, wenn es ein 1D-Array ist, und es dann zu einer anderen Spalte hinzufügen? Wenn es 2D wäre, könnte ich nicht einfach [1][4]
und [1][5]
angeben und eine Operation wie diese ausführen, dann speichern Sie es als [1][6]
und so weiter oder sollte ich bei Malloc bleiben?C Eingabedatei lesen und für einen Typ aufsteigend sortieren
Eingabedatei:
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
Programm unvollständig:
#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;
}
Erwartetes Ergebnis:
Make Model year city mpg highway mpg average mpg
Jeep Wrangler 2016 17 21 19
Mercury Sable 2009 18 28 23
and so on...
Wenn ein [Minimal, vollständig und prüfbare Beispiel] Erstellen (http://stackoverflow.com/help/mcve) hilft es in der Regel, dass es tatsächlich * ist * vollständig und überprüfbar. Mit anderen Worten, es kompiliert und läuft. Es sei denn, Sie fragen nach Build- oder Laufzeitfehlern. Und neben der erwarteten Ausgabe auch die * tatsächliche * Ausgabe. –
Bitte lesen Sie auch [Warum ist "while (! Feof (Datei))" immer falsch?] (Http: // stackoverflow.com/questions/5431941/why-is-while-feof-Datei-immer falsch). –
In Ihrem eigenen Code wird jede Art von Auto durch ein Objekt vom Typ 'struct car' repräsentiert. Sie müssen mehrere solcher Objekte unterbringen. Die Art und Weise, wie Sie sich dazu entschieden haben, dies zu tun, ist über eine Reihe von "struct car" (was in Ordnung ist). Warum brauchen Sie dafür ein 2D-Array? –