Code:
#include <malloc.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h> // exit
typedef struct StudentDynamic
{
char* firstName;
char* lastName;
float grade;
}StudentDynamic;
void exportCSV(char *filename, StudentDynamic* pStudents, int nStudents)
{
printf("\n Creating %s.csv file. \n ", filename);
FILE *fp;
filename = strcat(filename, ".csv");
fp = fopen(filename, "w+");
fprintf(fp, "Student No., First Name, Last Name, Grade");
for (int i = 0; i<nStudents; ++i)
{
fprintf(fp, "\n%d", i+1);
fprintf(fp, ",%s ", pStudents[i].firstName);
fprintf(fp, ",%s ", pStudents[i].lastName);
fprintf(fp, ",%f ", pStudents[i].grade);
}
fclose(fp);
printf("\n File %s succesfully created!\n", filename);
}
void printStudents(StudentDynamic* pStudents, int nStudents)
{
printf("========== List of Students ==========\n");
for (int i = 0; i < nStudents; ++i)
{
printf("%d. %10s %10s %7.2f", i + 1,
pStudents[i].firstName,
pStudents[i].lastName,
pStudents[i].grade);
printf("\n");
}
}
int main()
{
//UNUSED VAR
int nStudents, i;
char choice;
printf("\t\t================== STUDENT DATABASE APPLICATION ==================");
printf("\n\n ");
printf("\n\n");
printf(" \n\t\t\t============================================");
printf("\n \t\t\t 1. Read Students from Default File");
printf("\n \t\t\t 2. Create Student");
printf("\n \t\t\t 3. Update Record");
printf("\n \t\t\t 4. Delete Record");
printf("\n \t\t\t 5. Export DB to CSV");
printf("\n \t\t\t 6. List Students");
printf("\n \t\t\t 7. Exit Program");
printf(" \n\t\t\t============================================");
printf("\n\n");
printf("\t\t\t Select Your Choice : ");
// You cannot declare data types in a switch
StudentDynamic* pStudents = NULL;
char auxfirstName[100], auxlastName[100];
float auxGrade;
FILE* pFile = fopen("InitialDB.txt", "r");
char str[100];
while (1)
{
// fflush(stdin);
// choice = getche();
choice = getchar();
printf("\n");
switch (choice)
{
case '1':
// StudentDynamic* pStudents = NULL;
// char auxfirstName[100], auxlastName[100];
// float auxGrade;
// FILE* pFile = fopen("InitialDB.txt", "r");
if (pFile == NULL)
{
printf("Could not open file or is empty! Exiting...");
exit(2);
}
int i = 0;
pStudents = (StudentDynamic*)malloc(sizeof(StudentDynamic) * 1);
while (!feof(pFile))
{
fscanf(pFile, "%s", auxfirstName);
pStudents[i].firstName = (char*)malloc(strlen(auxfirstName) + 1);
strcpy(pStudents[i].firstName, auxfirstName);
fscanf(pFile, "%s", auxlastName);
pStudents[i].lastName = (char*)malloc(strlen(auxlastName) + 1);
strcpy(pStudents[i].lastName, auxlastName);
fscanf(pFile, "%f", &auxGrade);
pStudents[i].grade = auxGrade;
i++;
pStudents = (StudentDynamic*)realloc(pStudents, sizeof(StudentDynamic) * (i + 1));
}
nStudents = i;
fclose(pFile);
break;
case '2':
pStudents = (StudentDynamic*)realloc(pStudents, sizeof(StudentDynamic) * (i + 1));
printf("Details of the new student:\n");
printf("First name: ");
scanf("%s", pStudents[i].firstName);
printf("Last Name: ");
scanf("%s", pStudents[i].lastName);
printf("Grade: ");
// you're telling it to get an int
// when you data type in struct is float
//needs adjustment.
// scanf("%d", &pStudents[i].grade);
break;
case '5':
// char str[100];
printf("\n Enter the filename: ");
//term2.c:134:13: warning: implicit declaration of function 'gets' [-Wimplicit-function-declaration]
// but is my compiler, Linux, I think you're using windows?
gets(str);
exportCSV(str, pStudents, nStudents);
break;
case '6':
printStudents(pStudents, nStudents);
break;
case '7':
for (int i = 0; i < nStudents; ++i)
{
free(pStudents[i].firstName);
free(pStudents[i].lastName);
}
free(pStudents);
printf("\n\n");
printf("\t\t Thank you for using my application. Have a nice day. (-_-)");
printf("\n\n");
exit(0);
}
}
return 0;
}