读取,填充和编写结构数组到二进制文件

时间:2013-02-22 21:47:25

标签: c binaryfiles

我正在为类创建一个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

1 个答案:

答案 0 :(得分:3)

我很确定这个:

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

将所有寂寞排在一条线而不指定结果FILE*与您的问题有很大关系。例如,还有很多其他问题:

flush;

不确定那是什么意思。也许你的意思是:

fflush(f);

假设f实际上已正确分配,

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