如何创建一个函数来从文件中读取结构变量并比较字符串日期?

时间:2016-01-20 03:55:49

标签: c

我正在尝试构建一个从结构数组中读取主键的函数,以进一步比较存储日期(Members [x] .expdate和当前日期)的结构中的两个相应变量,以输出结果“已过期“如果当前日期大于到期日期,则成员[x] .expdate,否则为”有效“。有人能告诉我我将如何这样做吗?

这是结构,“ssn”是主键。

struct MembershipInfo_t
{
char ssn[MAX_BUFFER_LEN];
int   set;
unsigned payplan;
char  cust_fname[ MAX_BUFFER_LEN ];
char  cust_lname[ MAX_BUFFER_LEN ];
char  memtype[ MAX_BUFFER_LEN ];
char  date[ MAX_BUFFER_LEN ];
char selection[ MAX_BUFFER_LEN ][10];
char status[ MAX_BUFFER_LEN ];
char  expdate[ MAX_BUFFER_LEN ];
};

单独的功能会提示用户输入上述内容并将其存储在DAT文件中。

到目前为止,这是我应该确定验证的函数

void MemberExp()
{

FILE *Membership;

Membership= fopen("MembershipRecord.DAT", "rb");


printf("Please enter social security number\n");
scanf( "%s" , ssncheck);
fscanf(Membership, "%s", Members[x].ssn);

if(strcmp(ssncheck, Members[x].ssn)==0){



}





fclose(Membership);
}

您能帮我创建执行上述功能吗?

要消除歧义,提示用户输入信息的功能会将其放在文件中,例如:

John    Daley
Platinum Membership
You have all services available
SSN: 123-456-789
The Full cost is $ 1230
19 January 2016
Expiration Date: 19 February 2016




Ron John
Platinum Membership
You have all services available
SSN: 223-456-789
The Full cost is $ 1230
19 January 2016
Expiration Date: 19 March 2016

我想创建的函数将使用SSN识别记录,所以如果我输入223-456-789,我将使用Ron John的所有数据访问结构数组。如果我输入123-456-789,我将使用John Daley的所有数据访问结构数组。 然后,它将获得我想要使用其SSN访问的任何成员的到期日期,并将其与当前日期进行比较。同样,如果当前日期超过了成员[x] .expdate,在John Daley是2月19日的情况下,它将显示“已过期”或“有效”否则

1 个答案:

答案 0 :(得分:0)

要比较日期,您可以使用difftime()功能;首先通过strptime()将日期转换为正确的格式:

bool check_expired(const char *date, const char *expdate)
{
    struct tm tm_date, tm_expdate;

    if (strptime(date, "%d %b %Y", &tm_date) == NULL
        || strptime(expdate, "%d %b %Y", &tm_expdate) == NULL) {
        // wrong format, count as expired
        printf("strptime failed\n");
        return true;
    }

    return difftime(mktime(&tm_date), mktime(&tm_expdate)) < 0;
}

为了比较记录,出于性能原因,最好的想法通常是读取文件一次,然后将所有记录保存在内存中的数组中。

如果不可能或不需要,此逻辑应该有效:逐行读取文件。保留当前记录并填写它,直到所有字段都已填满。然后进行SSN检查;它匹配,比较日期和打破文件读取循环。假设记录总是6个非空行:

#define _XOPEN_SOURCE
#include <time.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

// ...

void member_exp()
{
    FILE *membership;
    struct MembershipInfo_t member;
    char line[256];
    char ssncheck[20];
    char tmp1[20], tmp2[20];
    int record_line = 0;

    membership = fopen("MembershipRecord.DAT", "rb");

    printf("Please enter social security number\n");
    if (scanf("%20s", ssncheck) != 1) {
        return;
    }

    while (fgets(line, sizeof(line), membership)) {
        // check if the line is whitespace only
        char *p = line;
        bool is_spaces_only = true;
        while (*p) {
            if (!isspace(*p)) {
                is_spaces_only = false;
                break;
            }
            p++;
        }
        if (is_spaces_only) {
            continue;
        }

        switch (record_line) {
        case 0:
            sscanf(line, "%s %s", member.cust_lname, member.cust_fname);
            break;
        case 1:
            sscanf(line, "%s", member.memtype);
            break;
        case 2:
            // TODO
            break;
        case 3:
            sscanf(line, "SSN: %s", member.ssn);
            break;
        case 4:
            // TODO
            break;
        case 5:
            sscanf(line, "%20s %20s %20s", member.date, tmp1, tmp2);
            strcat(member.date, " ");
            strcat(member.date, tmp1);
            strcat(member.date, " ");
            strcat(member.date, tmp2);
            break;
        case 6:
            sscanf(line, "Expiration Date: %20s %20s %20s", member.expdate, tmp1, tmp2);
            strcat(member.expdate, " ");
            strcat(member.expdate, tmp1);
            strcat(member.expdate, " ");
            strcat(member.expdate, tmp2);
            break;
        }

        record_line++;
        if (record_line > 6) {
            if (!strcmp(member.ssn, ssncheck)) {
                printf("record found. it is %sexpired\n",
                        check_expired(member.date, member.expdate) ? "not " : "");
                break;
            }
            record_line = 0;
        }
    }

    fclose(membership);
}