将结构写入文本文件

时间:2015-03-20 04:37:23

标签: c file struct

所以我最近得到了结构的悬念,我终于对Arrays感到满意了,现在我必须处理我教授希望我能够存储100万个结构(工资单记录)的文件,我非常确定一个阵列大会破坏我的程序。所以我很困惑如何将结构备份到txt文件中并在启动时将它们上传回我的程序。文字会不会像一团糟一样?这是我的程序的主要部分,我需要将其放入文件中。它基本上使用结构创建工资单记录。所以我只是想知道任何人都可以给我一些关于将其发送到文本文件的提示

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);

3 个答案:

答案 0 :(得分:5)

您可以使用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);

检查返回代码!

答案 1 :(得分:1)

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

您可以使用open()和write()以及read()来存储数据。 或者你可以使用fopen(),fclose(),fprintf(),fgets()等...但是你必须在处理EOL标记和null终止符等方面一丝不苟......手册页突出了你的详细信息需要密切关注分隔符和记录大小。

使用open(),read(),write(),close(),只要有固定的记录大小(在这种情况下是结构大小),你就不需要处理记录分隔符。只要文件系统有空间,写出一百万条记录应该没有问题。读回所有数据可以达到可用内存的限制。如果你有更多的数据,你可以在内存中实际管理,你需要以块为单位读取它,然后用新数据覆盖内存。某种分页机制或其他东西。别无选择。你要么拥有磁盘空间和内存,要么就是没有,如果你没有创造力,你就必须找到一种策略来量化阅读或写作,翻译或与用户互动。

如果您正在打印工资单,您可以在循环读取数据时继续打印到打印机,并且不必在一个数据库中保留多个记录(结构的价值)记忆中的时间。在现实生活中,通常以某种方式对大型文件进行索引并键入,以便限制一次需要加载的数量。它当然可以在C中完成,但随着它变得越来越复杂,使用数据库显然更容易。

只要你不会超出固定大小的阵列或内存,你就不会得到垃圾。如果需要动态增长数组,请使用指针并使用malloc()或calloc()一次分配一条记录,并在结构中创建指针(通常命名为' prev'和' next'按惯例),(指向结构类型的指针),在分配它们时指向下一个条目和上一个条目。它被称为链接列表,在线应该有很多关于如何创建链接列表的例子。

HTH。

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

答案 2 :(得分:1)

我假设您想要将PAYROLL记录数组写入文件。一些提示:

  1. 为每条记录使用新行。这样,如果你想手动编辑文件,你可以这样做。你也可以通过fgets()每行读它。
  2. 使用分隔符和代币:例如您可以拥有Employee name####10.00(pay rate)#### details之类的行。阅读时,使用strtok将字符串拆分为其组成部分,然后使用sscanf从中提取详细信息。
相关问题