C 将结构写入文本文件

C 将结构写入文本文件,c,file,struct,C,File,Struct,因此,我最近掌握了结构的诀窍,并最终熟悉了数组,现在我必须处理我的教授希望我能够存储100万个结构(工资记录)的文件,我非常确定,这么大的数组会使我的程序崩溃。因此,我对如何将结构备份到txt文件并在启动时将其上载回我的程序感到困惑。这篇文章会变得一团糟吗?这是我的程序的主要部分,我需要将其放入一个文件中。它基本上使用struct生成工资记录。所以我只是想知道有没有人能给我一些把这个发送到文本文件的提示 void payRollAdd(PAYROLL employee[], long int *

因此,我最近掌握了结构的诀窍,并最终熟悉了数组,现在我必须处理我的教授希望我能够存储100万个结构(工资记录)的文件,我非常确定,这么大的数组会使我的程序崩溃。因此,我对如何将结构备份到txt文件并在启动时将其上载回我的程序感到困惑。这篇文章会变得一团糟吗?这是我的程序的主要部分,我需要将其放入一个文件中。它基本上使用struct生成工资记录。所以我只是想知道有没有人能给我一些把这个发送到文本文件的提示

void payRollAdd(PAYROLL employee[], long int *pCounter){    
    int userinput;
    do{
        printf("Enter Employee Name:\n");
        fgets(employee[*pCounter].name, 40, stdin);
        printf("Please Enter the paydate(mmddyyyy):\n");
        scanf_s("%02d%02d%d", &employee[*pCounter].payDate.month, &employee[*pCounter].payDate.day, &employee[*pCounter].payDate.year);
        printf("Enter Employee Age:\n");
        scanf_s("%d", &employee[*pCounter].age);
        printf("Enter Employee Hours Worked\n");
        scanf_s("%f", &employee[*pCounter].hrsWorked);
        printf("Enter Employee Hourly Wage:\n");
        scanf_s("%f", &employee[*pCounter].hrlyWage);
        printf("  Employee Data \n");
        printf("Name: %s\n", employee[*pCounter].name);
        printf("Age:  %d\n", employee[*pCounter].age);
        printf("Pay Date: %02d/%02d/%d:\n", employee[*pCounter].payDate.month, employee[*pCounter].payDate.day, employee[*pCounter].payDate.year);
        printf("Hours Worked: %0.2f\n", employee[*pCounter].hrsWorked);
        printf("Hourly Wage: $%0.2f\n", employee[*pCounter].hrlyWage);


        if (employee[*pCounter].hrsWorked > 40.00){
            float temp = 40.00;
            employee[*pCounter].regPay = temp * employee[*pCounter].hrlyWage;
            printf("Regular pay: $%0.2f\n", employee[*pCounter].regPay);
        }
        else
        {
            employee[*pCounter].regPay = employee[*pCounter].hrsWorked * employee[*pCounter].hrlyWage;
            printf("Regular pay: $%0.2f\n", employee[*pCounter].regPay);
        }
        if (employee[*pCounter].hrsWorked > 40.00){
            float temp2 = 0.00;
            temp2 = employee[*pCounter].hrsWorked;
            temp2 -= 40.00;
            employee[*pCounter].otPay = temp2 * `(employee[*pCounter].hrlyWage + (employee[*pCounter].hrlyWage / 2.00));`
            printf("OT pay: $%0.2f\n", employee[*pCounter].otPay);
        }
        else
        {
            employee[*pCounter].otPay = 0;
            printf("OT pay: $0\n");
        }
        employee[*pCounter].totalPay = employee[*pCounter].regPay + employee[*pCounter].otPay;
        printf("Total Pay: $%0.2f\n", employee[*pCounter].totalPay);

您可以使用fseek、fwrite和fread的组合来读写并查找文件中的结构:

fseek(fp,0L,SEEK_END);
fwrite(&employee,sizeof(employee),1,fp);
您可以执行类似于在中读取记录的操作:

fseek(fp,sizeof(employee) * recno,SEEK_SET);
fread(&employee,sizeof(employee),1,fp);

检查返回代码

如果使用标志变量,大多数do{}语句都可以写成while{}语句,这使得代码更易于阅读,因为可以在循环顶部看到条件

您可以使用open()和write()以及read()来存储数据。 或者,您可以使用fopen()、fclose()、fprintf()、fgets()等。。。但是,在处理下线标记和空终止符等方面,您必须非常谨慎。。。手册页突出显示了需要密切关注的有关分隔符和记录大小的详细信息

对于open()、read()、write()、close(),只要有固定的记录大小(本例中为struct size),就不需要处理记录分隔符。只要文件系统有足够的空间,写出一百万条记录应该没有问题。在可用内存的限制下,读回所有数据是很好的。如果内存中的数据超过实际管理能力,则需要分块读取数据,然后用新数据重写内存。某种寻呼机制之类的。别无选择。你要么有磁盘空间和内存,要么没有,如果没有,你就必须发挥创造力,找到一种策略来量化读写、翻译或与用户交互

如果您正在打印工资单,您可以在循环中读取数据时继续打印到打印机,而不必在内存中一次保存多条数据记录(结构值)。在现实生活中,大型文件通常以某种方式编制索引并设置关键帧,从而限制了需要一次加载的文件量。当然,这可以用C语言完成,但随着它变得越来越复杂,使用数据库显然更容易

只要不溢出固定大小的数组或内存,就不会产生垃圾。如果需要动态扩展数组,请使用指针并使用malloc()或calloc()一次分配一条记录的值,并在结构中创建指针(通常按约定命名为“prev”和“next”)(这是指向结构类型的指针),以便在分配时指向下一个条目和上一个条目。这叫做链表,网上应该有很多关于如何创建链表的例子


PS:fseek()建议也不错,但我认为这不是你的问题(例如,如何随机访问数据)

我假设你想将工资记录数组写入一个文件。一些提示:

  • 为每条记录使用新行。这样,如果要手动编辑文件,可以这样做。您还可以通过fgets()对每一行进行读取
  • 使用分隔符和标记:例如,您可以有一行,例如
    员工姓名#####10.00(工资率)####详细信息
    。阅读时,使用
    strtok
    将字符串拆分为其组成部分,然后使用
    sscanf
    从中提取细节

  • 使用java序列化在大多数现代桌面上,100万个结构的数组就可以了,只要您使用
    malloc
    为数组保留内存。换言之,不要将数组声明为局部变量(在堆栈上),这样就可以了。REC的可能重复并不意味着什么?它是“记录编号”,与“pCounter”相同。只是一个变量名。