我正在尝试构建一个从结构数组中读取主键的函数,以进一步比较存储日期(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日的情况下,它将显示“已过期”或“有效”否则
答案 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);
}