Consider the data file “assignment-07-input.csv.
The data contains of 4 different things separated by comma – origin airport code (3 characters),
destination airport code (3 characters), airline code (2 characters), passenger count (integer).
There is no header row, so you do not have to deal with it. Write code to do the following:
• The program will take 3 extra command line arguments & use a makefile to run.
o Input file name
o Output file name
o Airline code
• Once run, the program should calculate the count the number of passengers for the
input airline code and write the count to the output file “assignment-07-output.txt”.
Your program should validate the command line arguments before continuing with the
main program execution.
• Read and parse the CSV file and store the data in a structure “RouteRecord”. Each
RouteRecord will have the following data members
o origin airport code (3 characters - SAT)
o destination airport code (3 characters - SAT)
o airline code (2 characters - AA)
o passenger count (integer)
• Create 3 separate files – routerecords.h, routerecords.c & a7.c
• Create different functions that are needed to read data from the file. Make sure to have
proper prototypes, header guards, header includes, etc.
o You must dynamically create an array of RouteRecords.
o The file will not contain the number of RouteRecords, you should read the file
once to know the value of N and then populate the array.
• Create function(s) which goes through the data array and calculates the number of
passengers for the input airline code. Write the number to the output file.
• You need to create a MAKEFILE.
• An example to run the program using the makefile would be
make
./a7 assignment-07-input.csv assignment-07-output.csv AA
***csv file**
Part of Data Set
| JFK | LHR | BA | 87133 |
| JFK | LHR | VS | 61962 |
| JFK | CDG | AF | 61178 |
| LGA | YYZ | AC | 60792 |
| SFO | TPE | BR | 57801 |
| MIA | LHR | BA | 56095 |
| JFK | STI | B6 | 55885 |
| SFO | HKG | CX | 55012 |
| JFK | DXB | EK | 54746 |
| LAX | TPE | BR | 54741 |
| FLL | YUL | RV | 54217 |
| LAX | ICN | OZ | 54103 |
| LAX | HKG | CX | 52285 |
| DFW | CUN | AA | 51561 |
| JFK | SDQ | B6 | 51402 |
| DFW | LHR | AA | 49292 |
| ATL | CUN | DL | 49223 |
| MIA | PTY | CM | 48212 |
| GUM | NRT | UA | 46674 |
| LAX | PEK | CA | 46434 |
| MIA | CUN | AA | 45570 |
| LAX | ICN | KE | 45301 |
| JFK | HKG | CX | 45191 |
| LAX | LHR | BA | 45053 |
| LAX | YYZ | AC | 43925 |
| LAX | MEX | AM | 42424 |
| MIA | HAV | AA | 42310 |
| MIA | BOG | AV | 42134 |
| JFK | ICN | KE | 42050 |
| EWR | LHR | UA | 42022 |
| MIA | GRU | JJ | 41789 |
| FLL | YYZ | RV | 41383 |
| ATL | YYZ | DL | 41283 |
| LAX | MNL | PR | 40737 |
| HNL | NRT | JL | 40108 |
| MCO | PTY | CM | 39171 |
First of all the function prototypes foes in the file routerecords.h, so that any other program can use it's function
##ifndef ROUTERECORD_H #define ROUTERECORD_H typedef struct RouteRecord RouteRecord; int countRows(char* input_file_path); struct RouteRecord* readInputFile(char* input_file_path, int N); int findAirlinePassengerCount(struct RouteRecord* data, char* given_code, int N); void writeResult(char* output_file_path, int result); #endif
Then here goes the definition of the functions declared in the header file, written in routerecords.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct RouteRecord{
char origin[10];
char destination[10];
char airline_code[10];
int passenger_count;
} RouteRecord;
int countRows(char* input_file_path) {
FILE *file = fopen(input_file_path, "r");
char buf[16];
if(!file) {
printf("can't open the file\n");
return -1;
}
int count = 0;
while(fgets(buf, 1024, file)) count++;
fclose(file);
return count;
}
struct RouteRecord* readInputFile(char* input_file_path, int N) {
FILE *file = fopen(input_file_path, "r");
char buf[16];
char *token;
if(!file) {
printf("can't open the file\n");
return NULL;
}
struct RouteRecord *array;
array = malloc(N * sizeof(struct RouteRecord));
int i = 0;
while(fgets(buf, 1024, file)) {
buf[16] = '\0';
token = strtok(buf, ",");
strcpy((array + i)->origin,token);
token = strtok(NULL, ",");
strcpy((array + i)->destination, token);
token = strtok(NULL, ",");
strcpy((array + i)->airline_code, token);
token = strtok(NULL, ",");
int passenger_count;
sscanf(token, "%d", &(array + i)->passenger_count);
token = NULL;
i++;
}
fclose(file);
return array;
}
int findAirlinePassengerCount(struct RouteRecord* data, char* given_code, int N){
int count = 0;
for(int i=0; i<N; i++)
if(!strcmp(data[i].airline_code, given_code)) count += data[i].passenger_count;
return count;
}
void writeResult(char* output_file_path, int result){
FILE *fptr;
fptr = fopen(output_file_path, "w");
if (fptr == NULL) {
printf("Can't create/open the file");
exit(1);
}
fprintf(fptr, "%d", result);
fclose(fptr);
return;
}
and then finally the main program which uses the functionality that is defined above, written in file a7.c as follows,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "routerecord.h"
int main(int argc, char* argv[]) {
if(argc < 4) {
printf("Three argument required < inpit file name, output file name, Airline codes >\n");
return 1;
}
int N = countRows(argv[1]);
struct RouteRecord* data = readInputFile(argv[1], N);
int result = findAirlinePassengerCount(data, argv[3], N);
writeResult(argv[2], result);
return 0;
}
finally a make file for the above program,
assignment-07-output.txt : routerecord.o
./routerecord.o temp_in.csv "assignment-07-output.txt" VS
routerecord.o : a7.c routerecord.c routerecord.h
gcc a7.c routerecord.c -o routerecord.o
The functions are written in the header file routerecord.h shown above which has it's function definitions in file routerecord.c which then used through the file a7.c. the read function reads the csv and store each row that is a record and save it to the dynamically allocated array. The airline code can be searched through that array and there we can get the total number of passangers in the airline with the specific airline code/
Consider the data file “assignment-07-input.csv. The data contains of 4 different things separated by comma –...
Description Data Engineers regularly collect, process and store data. In this task you will develop a deeper understanding of how C programming language can be used for collecting, processing and storing data. In this assignment you get the opportunity to build an interactive program that can manage the list of flights departing Sydney Airport. The list is stored as an array of flight_t type structures flight_t flights [MAX_NUM_FLIGHTS]; The flight_t is a structure typedef for struct flight. The struct flight...
I need help with this code,
I'm stuck on it, please remember step 4, I'm very much stuck on
that part. It says something about putting how many times it
appears
Assignment #1: Sorting with Binary Search Tree Through this programming assignment, the students will learn to do the following: Know how to process command line arguments. 1 Perform basic file I/O. 2. Use structs, pointers, and strings. Use dynamic memory. 3. 4. This assignment asks you to sort the...