1

我正在为班级创建一个 EMPLOYEE 记录文件的这个程序。我创建了两个结构。一个叫员工,一个叫约会。EMPLOYEE 结构有一个 char 数组、一个 int、6 个浮点值和 DATE(另一个结构)。DATE 结构只有三个 int 值(月、日、年)。

我创建了一个名为 person[1000] 的 EMPLOYEE 类型的数组。

这是我的代码,我在 Visual Studio 中不断收到调试断言失败错误,指向 fwrite.c Expression: (Stream !=NULL)。我确信这与我的 fread 或 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
4

1 回答 1

3

我很确定:

fopen("employeeRecords.bin", "ab+");

孤独地坐在一行上而不分配结果FILE*与您的问题有很大关系。还有很多其他问题,例如:

flush;

不太确定那是怎么回事。也许你的意思是:

fflush(f);

假设f曾经正确分配过,

正如评论中指出的那样,您应该在循环开始之前打开文件,然后根据需要写入数据,在循环结束后关闭它。

于 2013-02-22T21:53:05.450 回答