我正在为类创建一个EMPLOYEE记录文件的程序。我创造了两个结构。一个叫员工,一个叫日期。 EMPLOYEE结构有一个char数组,一个int,6个浮点值和DATE(另一个Struct)。 DATE结构只有三个int值(月,日,年)。
我创建了一个名为person [1000]的EMPLOYEE类型的数组。
这是我的代码,我一直在视觉工作室中指向fwrite.c的调试断言失败错误表达式:(Stream!= NULL)。我确信它与我的恐惧或fwite有关,因为我从未试图存储结构。
此函数开头的要点是,如果文件存在且不为空,则填充数组,因此当用户开始将数据存储到数组时,下标会更新。我知道这里可能还有其他几个问题,但首先是事情,这将是阅读和写作部分。
再次感谢,
麦克
void loadPayRoll(EMPLOYEE person[], int *i)
{
char sValidate[5] = "exit";
FILE *f;
int count = 0;
f = fopen("emplyeeRecords.bin", "rb");
if(f){
while(fread(&person[*i], sizeof(person), 1, f) > 0){
(*i)++;
}
fclose(f);
}
else {
while (strcmp( sValidate, person[*i].name)) {
fopen("employeeRecords.bin", "ab+");
printf("Please enter name or type exit to return to main menu: ");
scanf("%s", person[*i].name); //must use the '->' when passing by by refrence, must use '&' sign
flush;
if (!strcmp( sValidate, person[*i].name))
break;
printf("\nPlease enter age of %s: ", person[*i].name);
scanf("%i", &person[*i].age);
flush;
printf("\nPlease enter the hourlyWage for %s: ", person[*i].name);
scanf("%f", &person[*i].hourlyWage);
flush;
printf("\nPlease enter the hours worked for %s: ", person[*i].name);
scanf("%f", &person[*i].hoursWkd);
if (person[*i].hoursWkd > 40) {
person[*i].regPay = person[*i].hoursWkd * 40;
person[*i].otHoursWkd = person[*i].hoursWkd - 40;
person[*i].otPay = person[*i].otHoursWkd * (person[*i].hourlyWage * 1.5);
person[*i].totalPay = person[*i].regPay + person[*i].otPay;
}
else {
person[*i].totalPay = person[*i].hoursWkd * person[*i].hourlyWage;
}
flush;
printf("\nEnter 2 digit month: ");
scanf("%i", &person[*i].payDate.month); //must use the '->' when passing by by refrence, must use '&' sign
flush;
printf("\nEnter 2 digit day: ");
scanf("%i", &person[*i].payDate.day); //must use the '->' when passing by by refrence, must use '&' sign
flush;
printf("\nEnter 4 digit year: ");
scanf("%i", &person[*i].payDate.year); //must use the '->' when passing by by refrence, must use '&' sign
flush;
fwrite(&person[*i], sizeof(person), 1, f);
fclose(f);
(*i)++;
}
}
}//end function loadPayRoll
答案 0 :(得分:3)
我很确定这个:
fopen("employeeRecords.bin", "ab+");
将所有寂寞排在一条线而不指定结果FILE*
与您的问题有很大关系。例如,还有很多其他问题:
flush;
不确定那是什么意思。也许你的意思是:
fflush(f);
假设f
实际上已正确分配,
正如在注释中指出的那样,你应该在循环开始之前打开文件,然后根据需要写入数据,在循环结束后关闭它。