#include #include #include struct record { int age; char name[12]; int department; }; const int size_of_record = 20; void print_record (struct record a) { printf("Record: age = %10d, name = %12s, department = %10d\n", a.age, a.name, a.department); } // constructs an integer out of the contents of four bytes of memory. int characters_to_integer(char * buffer) { int result; memcpy(&result, buffer, 4); return result; } // stores the four bytes representing an integer into an array of characters. int integer_to_characters(int number, char * buffer) { memcpy(buffer, &number, 4); } // If a record could not be read, we make result.age = -1, // to mark that the record is invalid. struct record read_record(FILE * file_handle) { struct record result; char input_buffer[size_of_record]; int items = fread(input_buffer, sizeof(char), size_of_record, file_handle); if (items != size_of_record) { result.age = -1; return result; } result.age = characters_to_integer(& (input_buffer [0])); memcpy(result.name, &(input_buffer [4]), 12); result.department = characters_to_integer(& (input_buffer [16])); return result; } void save_record(FILE * file_handle, struct record a) { char output_buffer[size_of_record]; integer_to_characters(a.age, &(output_buffer[0])); memcpy(&(output_buffer[4]), a.name, 12); integer_to_characters(a.department, &(output_buffer[16])); fwrite(output_buffer, sizeof(char), size_of_record, file_handle); } // This is a helper function, that can be used // (and modified) so as to create some test files. void helper(char * filename) { FILE * handle = fopen(filename, "wb"); struct record item; item.age = 56; strcpy(item.name, "john smith"); item.department = 6; save_record(handle, item); item.age = 46; strcpy(item.name, "mary jones"); item.department = 12; save_record(handle, item); item.age = 36; strcpy(item.name, "tim davis"); item.department = 5; save_record(handle, item); item.age = 26; strcpy(item.name, "pam clark"); item.department = 10; save_record(handle, item); fclose(handle); } // this is the function you need to write, that: // - takes in a record called "item", // - does whatever conversions are needed (as specified by the value of number) // - writes the data to the output handle. void convert_and_save(struct record item, FILE * output_handle, int number); int main(int argc, char ** argv) { int number = atoi(argv[1]); char * input_file = argv[2]; char * output_file = argv[3]; FILE * input_handle = fopen (input_file, "rb"); FILE * output_handle = fopen(output_file, "wb"); while(1) { struct record item = read_record(input_handle); if (item.age == -1) { break; } printf("\nread: "); print_record(item); // This is where your function is called. convert_and_save(item, output_handle, number); } fclose(input_handle); fclose(output_handle); return 0; }