I have these structs. and I have two files one is program.dat and other is course.dat and I am supposed to load the values from those .dat files to the struct.
The separation between attributes in program.dat and course.dat is '|'
for example programID|programTitle|ProgramCode........
and I have used string tokenizer and they work perfectly but it doesn't load in link list. The course should add to those program when course's program ID will match with program ID. In other words there is an program Id attribute for each course .But My question is they dont load when i use while loop to print the value I GET SEGMENTATION FAULT ERROR HELP PLEASE
typedef struct course
{
char courseID[COURSE_ID_LEN + 1]; /* Unique ID for a course */
char progID[PROG_ID_LEN + 1];
char courseTitle[MAX_TITLE_LEN + 1];
char courseCode[COURSE_CODE_LEN + 1];
unsigned creditPoints;
TeachPeriodType teachPeriods[NUM_TEACHPERIODS];
char courseDescription[MAX_DESC_LEN];
CourseTypePtr nextCourse;
} CourseType;
typedef struct program
{
char progID[PROG_ID_LEN + 1]; /* Unique ID for a program */
char progTitle[MAX_TITLE_LEN + 1];
char progMajor[MAX_TITLE_LEN + 1];
char progCode[PROG_CODE_LEN + 1];
float progDuration;
char progType[PROG_TYPE_LEN]; /* Undergrade(UG) or Postgrad (PG) */
char progMode[MODE_LEN]; /* Full-time (FT) or Part-time (PT) */
char progDescription[MAX_DESC_LEN];
char majorDescription[MAX_DESC_LEN];
ProgramTypePtr nextProgram;
CourseTypePtr headCourse;
unsigned numCourses;
} ProgramType;
typedef struct pms
{
ProgramTypePtr headProgram;
unsigned numPrograms;
} PMSType;
This is my implemented code to LoadData
int loadData(PMSType* pms, char* programFile, char* courseFile)
{
FILE *fp;
FILE *fp2;
char *programLine;
char *courseLine;
if(!(fp=fopen(programFile, "r"))){
printf("Error occurered while opening the program.dat file");
return 0;
}
if(!(fp2=fopen(courseFile,"r"))){
printf("Error occurered while opening the course.dat file");
return 0;
}
char *progId;
char *progType;
char *progTitle;
char *progMajor;
char *progCode;
char *progDuration;
char *progMode;
char *progDescription;
char *majorDescription;
char *courseId;
char *cProgId;
char *courseTitle;
char *courseCode;
char *creditPts;
char *tPeriod;
char courseDesc;
ProgramType *prevProgram, *newProgram, *currProgram;
CourseType *newCourse, *prevCourse, *currCourse;
int i, j;
char arra[500][500];
char line[500]; /* or other suitable maximum line size */
for(i=0; i<500; i++)
for(j=0; j<500; j++)
arra[i][j] = '\0';
for(i=0; i<500; i++)
line[i] = '\0';
if ( fp != NULL )
{
i=0;
while ( fgets ( line, sizeof line, fp ) != NULL ) /* read a line */
{
strcpy(arra[i], line);
printf("array ----> %s ", &arra[i]);
i++;
prevProgram=NULL;
currProgram=pms->headProgram;
progId = strtok(arra, "|");
if(progId == NULL)
{
printf("Program Id\n");
break;
}
progType = strtok(NULL, "|");
if(progType==NULL)
{
printf("Program Type\n");
break;
}
progTitle=strtok(NULL,"|");
if(progTitle==NULL)
{
printf("Program title\n");
break;
}
progMajor=strtok(NULL,"|");
if(progMajor==NULL)
{
printf("Major\n");
break;
}
progCode=strtok(NULL,"|");
if(progCode==NULL)
{
printf("Program Code\n");
break;
}
progDuration=strtok(NULL,"|");
if(progDuration==NULL)
{
printf("Duration\n");
break;
}
progMode=strtok(NULL,"|");
if(progMode==0)
{
printf("mode\n");
break;
}
progDescription=strtok(NULL,"|");
if(progDescription==NULL)
{
printf("program Description\n");
break;
}
majorDescription=strtok(NULL,"|");
if(majorDescription==NULL)
{
printf("major Description\n");
break;
}
/*trying to reach to the last element of link list*/
while(currProgram != NULL)
{
if(strcmp(progTitle,currProgram->progTitle) < 0)
{
break;
}
prevProgram = currProgram;
currProgram = currProgram->nextProgram;
}
newProgram=(ProgramType*)malloc(sizeof(ProgramType));
newProgram->progCode=progCode;
newProgram->progID=progId;
newProgram->progDescription=progDescription;
newProgram->progDuration=atof(progDuration);
newProgram->progMajor=progMajor;
newProgram->progTitle=progTitle;
newProgram->progType=progType;
newProgram->majorDescription=majorDescription;
if(prevProgram==0){
newProgram->nextProgram=pms->headProgram;
pms->headProgram=newProgram;
pms->numPrograms=pms->numPrograms+1;
}
else{
newProgram->nextProgram=currProgram;
prevProgram->nextProgram=newProgram;
pms->numPrograms=pms->numPrograms+1;
}
}
fclose ( fp );
}
else
{
perror ( fp );
/* why didn't the file open? */
/*****************************Loading Course*********************/
int x, y;
char array[500][500];
char lines[500]; /* or other suitable maximum line size */
for(x=0; ix500; x++)
for(y=0; y<500; y++)
array[x][y] = '\0';
for(x=0; x<500; x++)
lines[x] = '\0';
if ( fp != NULL )
{
x=0;
while ( fgets ( line, sizeof line, fp ) != NULL ) /* read a line */
{
strcpy(array[x], lines);
prevProgram=NULL;
currProgram=pms->headProgram;
prevCourse=NULL;
currCourse=currProgram->headCourse;
courseId=strtok(array,"|");
cProgId=strtok(NULL,"|");
courseTitle=strtok(NULL,"|");
courseCode=strtok(NULL,"|");
creditPts=atoi(strtok(NULL,"|"));
tPeriod=strtok(NULL,"|");
courseDesc=strtok(NULL,"|");
while(currProgram!=NULL)
{
/*stop when program code will be
equal to course's program ID
and course will be added to that program
*/
if(strcmp(currProgram->progIDcProgId)==0)
{
break;
}
prevProgram=currProgram;
currProgram=currProgram->nextCourse;
}
newCourse = (CourseType*)malloc(sizeof(CourseType));
strcpy(newCourse->courseID,courseId);
strcpy(newCourse->progID,pCourseId);
strcpy(newCourse->courseTitle,courseTitle);
strcpy(newCourse->courseCode,courseCode);
newCourse->creditPoints=creditPts;
strcpy(newCourse->teachPeriods->semester,strok(tPeriod,","));
newCourse->teachPeriods->year=strok(NULL,",");
strcpy(newCourse->courseDescription,courseDesc);
newCourse->nextCourse=currProgram->headProgram;
currProgram->headProgram=newCourse;
}
fclose ( fp );
}
else
{
perror ( fp );
/* why didn't the file open? */
}
}