There is a segmentation fault somewhere near the beginning of the program but I cant figure out whats causing it.. I think its happening in the 'Openfile' function..

The programs supposed to read info from file line by line and sort it into structures.. example info: smart:kid:12345:12:12:12:12:A+

Its a rough draft but compiles I just need help with the segmentation error.
Code:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>


typedef struct
{
char last[30];
char first[30];
int id;
int scores[4];
char grade[5];
float average;
char fullname[60];
} stuRec;


bool OpenFile(char *argv[], FILE* *record);
void ReadData(stuRec Record[], FILE* record, int* numofstu);
void PrintMenu(int numofstu);
void SortName(stuRec Record[], int numofstu);
void SortId(stuRec Record[], int numofstu);
void SearchName(stuRec Record[], int numofstu);
void SearchId(stuRec Record[], int numofstu);
void PrintReport(stuRec Record[], int numofstu);


int main(int argc, char *argv[])
{
int option, numofstu;
stuRec Record[80];
char nameSearch[20];
char idSearch[6];
FILE* record;


if(argc != 2)
{
printf("No filename entered."); 
return 0;
}
if(OpenFile(argv, &record))
return 0;
ReadData(Record, record, &numofstu);

do
{
PrintMenu(numofstu);
scanf("%d", &option);
switch (option)
{
case 1: SortName(Record, numofstu);
printf("The students have been sorted by the last name field");
break;

case 2: SortId(Record, numofstu);
printf("The students have been sorted using the student id field");
break;

case 3: PrintReport(Record, numofstu);
break;

case 4: SearchName(Record, numofstu);
break;

case 5: SearchId(Record, numofstu);
break;

case 6: break;

default: printf("Invalid input. Please try again\n");
return 0;
}

} while (option != 6);
return 0;
}


bool OpenFile(char *argv[], FILE* *record)
{
*record = fopen(argv[1], "r");
if(*record == NULL)
{
printf("Error opening %s, please try again.\n", argv[1]); 
return true;
}
else
return 0;
}


void ReadData(stuRec Record[], FILE* record, int* numofstu)
{
char data[60];
int i;

for(i = 0, *numofstu = 0; i < 80; i++, *numofstu++)
{
fgets(data, sizeof(data), record);
if(8 != (sscanf(data, "%[^:]%*c%[^:]%*c%d%*c%d%*c%d%*c%d%*c%d%*c%s", Record[i].last, Record[i].first, Record[i].id, Record[i].scores[0], Record[i].scores[1], Record[i].scores[2], Record[i].grade)));
{
printf("Invalid data: %s", data);
i--;
*numofstu--;
continue;
}
if(sizeof(Record[i].last) > 10 || sizeof(Record[i].first) > 10 || Record[i].id < 30000 || Record[i].id > 79999 || Record[i].scores[0] < 0 || Record[i].scores[0] > 125 || Record[i].scores[1] < 0 || Record[i].scores[1] > 125 || Record[i].scores[2] < 0 || Record[i].scores[2] > 125 || Record[i].scores[3] < 0 || Record[i].scores[3] > 125)
{
printf("Invalid record: %s", data);
i--;
*numofstu--;
continue;
}
Record[i].average = ((Record[i].scores[0] + Record[i].scores[1] + Record[i].scores[2] + Record[i].scores[3])/4);
}
for(i = 0; i < *numofstu; i++)
{
strcpy(Record[i].fullname, Record[i].last);
sprintf(Record[i].fullname, ", ");
strcat(Record[i].fullname, Record[i].first);
}
}

void PrintMenu(int numofstu)
{
printf("There are %d records available.\n", numofstu);
printf("The actions available are: \n");
printf(" 1. Sort the records by the lastname field.\n");
printf(" 2. Sort the records by the Student ID field.\n");
printf(" 3. Print a report of the records.\n");
printf(" 4. Search for a record by Student last name and print the record.\n");
printf(" 5. Search for a record by Student ID and print the record.\n");
printf(" 6. Quit\n");
printf("Enter the number corresponding to the action that you want to perform:");
}

void SortName(stuRec Record[], int numofstu)
{
bool located;
stuRec temp;
stuRec* pcurrent;
stuRec* pwalker;
stuRec* plast;

for(pcurrent = Record + 1, plast = Record + numofstu; pcurrent <= plast; pcurrent++)
{
located = false;
temp = *pcurrent;

for(pwalker = pcurrent - 1; pwalker >= Record && !located; )
if(strcmp(temp.last, pwalker->last) < 0)
{
*(pwalker +1) = *pwalker;
pwalker--;
}
else
located = true;
*(pwalker +1) = temp;
}
}

void SortId(stuRec Record[], int numofstu)
{
int walk, temp, current;
bool located;

for(current = 1; current <= numofstu; current++)
{
located = false;
temp = Record[current].id;
for(walk = current - 1; walk>= 0 && ! located; )
if(temp < Record[walk].id)
{
Record[walk + 1].id = Record[walk].id;
walk--;
}
else
located = true;
Record[walk +1].id = temp;
}

}

void SearchName(stuRec Record[], int numofstu)
{
int i, j;
char name[20];
printf("\nPlease enter the student's last name: ");
scanf("%s", name);
stuRec Temp[80];

for(i = 0, j = 0; i < numofstu; i++)
if(0 == strncmp(Record[i].last, name, strlen(name)))
{
Temp[i] = Record[i];
j++;
}
if(j >= 1)
{
printf("+------------------------+-------+--------+--------+--------+--------+---------+-------+");
printf("| Student Name | ID | Test 1 | Test 2 | Proj 1 | Proj 2 | Average | Grade |");
printf("+------------------------+-------+--------+--------+--------+--------+---------+-------+");
}

for(i = 0; i < j; i++)
printf("+%24s| %d | %3d | %3d | %3d | %3d | %3.2f | %s |", Temp[i].fullname, Temp[i].id, Temp[i].scores[0], Temp[i].scores[1], Temp[i].scores[2], Temp[i].scores[3], Temp[i].average, Temp[i].grade);

if(j >= 1)
printf("+------------------------+-------+--------+--------+--------+--------+---------+-------+");
}

void SearchId(stuRec Record[], int numofstu)
{
int i, j;
int id;
printf("\nPlease enter the student's ID: ");
scanf("%d", id);
stuRec Temp[80];

for(i = 0, j = 0; i < numofstu; i++)
if(id == Record[i].id)
{
Temp[i] = Record[i];
j++;
}
if(j >=1)
{

printf("+------------------------+-------+--------+--------+--------+--------+---------+-------+");
printf("| Student Name | ID | Test 1 | Test 2 | Proj 1 | Proj 2 | Average | Grade |");
printf("+------------------------+-------+--------+--------+--------+--------+---------+-------+");
}

for(i = 0; i < j; i++)
printf("+%24s| %d | %3d | %3d | %3d | %3d | %3.2f | %s |", Temp[i].fullname, Temp[i].id, Temp[i].scores[0], Temp[i].scores[1], Temp[i].scores[2], Temp[i].scores[3], Temp[i].average, Temp[i].grade);

if(j >= 1)

printf("+------------------------+-------+--------+--------+--------+--------+---------+-------+");
}

void PrintReport(stuRec Record[], int numofstu)
{
int i;


printf("+------------------------+-------+--------+--------+--------+--------+---------+-------+");
printf("| Student Name | ID | Test 1 | Test 2 | Proj 1 | Proj 2 | Average | Grade |");
printf("+------------------------+-------+--------+--------+--------+--------+---------+-------+");
for(i = 0; i < numofstu; i++)
{
printf("+%24s| %d | %3d | %3d | %3d | %3d | %3.2f | %s |", Record[i].fullname, Record[i].id, Record[i].scores[0], Record[i].scores[1], Record[i].scores[2], Record[i].scores[3], Record[i].average, Record[i].grade);
}

printf("+------------------------+-------+--------+--------+--------+--------+---------+-------+");

}