结构中的输入数字 - 检查它是否已存在于文件中

时间:2012-12-23 10:55:41

标签: c struct eclipse-cdt

我正在尝试编写数据验证函数,其中ID号必须是结构数组中的唯一编号。每次我尝试保存有效的ID号时,程序都会崩溃 - 为什么会这样?

这是结构,以及结构数组的声明:

struct customer {                   // set up customer template    //
    char name [MAXNAM];
    char surname [MAXNAM];
    int idnum [MAX_ID];
    };
struct customer data_cus[MAXCUS];

这是在主程序中:

printf ("Please Enter ID Card, [NOTE! Only numbers are allowed!]\n");
                int checkID;

                while ((scanf ("%d",&checkID) == 0 || customerID(checkID, count)==1))
                {
                    printf ("This ID is already taken! Please enter unique ID!\n");
                    while (getchar()!='\n')
                    {
                        continue;
                    }
                    *data_cus[count].idnum = checkID;
                }

以下是用于检查id已存在于文件中的ID的函数:

int customerID (int cCheck, int count)
{
    FILE * pcustomer;
    int size = sizeof (struct customer);

    struct customer temp;

    rewind (pcustomer);
    while (fread (&temp,size,count,pcustomer)==1)
    {
        if (*temp.idnum == cCheck)
        {
            return 1;
        }
    }
    return 0;
}

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

scanf会返回成功匹配的项目数,我想你的意思是:

while (scanf ("%d",&checkID) == 1 && customerID(checkID, count)==1).

当您成功读取唯一ID时,应确保count不超过MAXCUS,并且由于每条记录,您不需要idnum的整数数组只有一个。

此外,函数customerID显然是错误的,在这里您阅读了多个customer结构并写入temp这是一个customer结构,这很有可能为什么崩溃:

 while (fread (&temp,size,count,pcustomer)==1)

如果您每次要检查新ID是否唯一时,都要跟踪数组中的ID而不是从文件中读取数据会容易得多。

答案 1 :(得分:0)

idnum是一个整数数组。这真的是你想要的,而不只是一个简单的整数?

我很确定如果从结构中删除[MAX_ID],事情就会好得多。

但是,一旦我们看到ID检查代码之后的代码,我保留更改动机为何崩溃的权利。