Question
In C ONLY . /* new function concepts */ addStudent - A wrapper function to add a student to the studentList->list. If there is not
In C ONLY .
/* new function concepts */
addStudent - A "wrapper" function to add a student to the studentList->list. If there is not enough memory, you need to allocate more memory in increments of 5 students.
freeAllStudents - Free all memory inside a list of structs (including all memory in each struct).
Hint 1: Use fgets() to read from a file into a buffer before creating a student. Continue to read from the file until fgets returns null (while(fgets != null)).
Hint 2: Use strtok to split the string passed to newStudent.
Hint 3: atoi converts a string to integer.
Hint 4: Remember to allocate memory for your studentList before assigning pointers.
/* Typedef creates an alias data type named "Student" to student student name and number. */
struct studentInfo
{
char *name;
int number;
};
typedef struct studentInfo Student;
/* Notice how you can use "Student" instead of "struct studentInfo" after the typedef */
struct studentList
{
int length;
Student *list;
};
typedef struct studentList List;
/* Creating a new struct from a string in the form "name, studentNumber" */
Student newStudent(char *string);
/* Free the memory inside of the struct */
void freeStudent(Student student);
/* Free all associated memory of a list of structs (including all memory in each struct)*/
void freeStudentArray(Student *studentList, int length);
/* Read an entire file and return a student list object variable */
List *readStudentFile(char *fileName);
/* Allocates new memory if required, then adds a student to the end of the list */
void addStudent(List *studentList, char *toAdd);
/* Free all memory inside a list of structs (including all memory in each struct)*/
void freeAllStudents(List *studentList);
/************************************************************************************************************************************************/
int main(int argc, char *argv[]) {
List *all = NULL;
int i;
if (argc < 1) {
printf("No file name was specified... Now exiting ");
exit(0);
} else {
all = readStudentFile(argv[1]);
}
printf("Now printing the student list before freeing the allocated memory ");
for (i = 0; i < all->length; i++) {
printf("\t%d: %s, %d ", i, all->list[i].name, all->list[i].number);
}
/* Free memory */
freeAllStudents(all);
free(all);
return 0;
}
/************************************************************************************************************************************************/
/* Creating a new struct from a string in the form "name, studentNumber" */
Student newStudent(char *string)
{
Student new;
char *token = strtok(string, ",");
int i = 0;
while (token != NULL) /*Loops as long as Token is not empty*/
{
if (i % 2 == 0)
{
//allocate memory for name
new.name = (char*)malloc(strlen(token)+1 * sizeof(char)); /
strcpy(new.name, token);
}
else
{
new.number = atoi(token);
}
token = strtok(NULL, ",");
++i;
}
return new;
}
/* Free any memory allocated inside of the student struct */
void freeStudent(Student studentToFree)
{
free(studentToFree.name);
}
/* Free all associated memory of a list of structs (including all memory in each struct)*/
void freeStudentArray(Student *studentList, int length)
{
int i;
for(i = 0 ; i < length;i++)
{
freeStudent(studentList[i]);
}
}
/* Read an entire file and return a dynamically allocated array */
List *readStudentFile(char *fileName)
{
/* Initialize the student List pointer (allocate memory), allocate enough memory to store 5 students */
/* Open the file, read content with fgets, close file */
List *allStudents = NULL;
char buffer[50];
FILE *fPtr;
int studentCount = 0;
/* Allocate enough memory to store 5 students */
list = (Student*)malloc(5 * sizeof(Student));
/* Open the file in read mode and see if it exists */
fPtr = fopen("testFile.txt", "r");
if (fPtr == NULL)
{
printf("Error opening input file ");
return NULL;
}
while (fgets(buffer,50,fPtr) != NULL)
{
list[studentCount++]=newStudent(buffer);
}
return allStudents;
}
/* Functions to Be Completed */
/* Allocate more memory for the list when the memory is full, then add to the back of the list */
void addStudent(List *studentList, char *toAdd)
{
/* Hint: use the length studentList->length */
}
/* Free all memory inside a list of structs (including all memory in each struct)*/
void freeAllStudents(List *studentList)
{
/* Hint: this function can be written easily in a couple lines (reuse other code) */
}
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started