【发布时间】:2018-02-07 17:02:08
【问题描述】:
我从下面显示的代码中得到一个段错误。我正在尝试创建一个简单的数据库,该数据库从 bin 文件中读取标准输入,并用逗号将其分割,将每个值放入数组中并将其放入结构中。我想对标准输入中的每一行都执行此操作,然后在最后将结构写入文件。
我从main 调用这个loadDatabase 函数。
数据在一行中如下所示,大约有 14 行:
34156155,MILES,NORMA,TAMMY,n/a,9/16/1964,FEMALE,123-45-6789,LAGUARDIA RD,SHLT,10915,n/a,n/a,CHESTER,NY,848-896-8296,n/a,NMILES@AMGGT.COM,n/a
这是我当前的代码。如果我的C真的很糟糕,请原谅。第一次……:
struct _record {
char ID[25];
char lname[25]; // last name
char fname[25]; // first name
char mname[25]; // middle name
char suffix[25];
char bday[25];
char gender[25];
char SSN[25];
char add1[25]; //address 1
char add2[25]; //address 2
char zip[25];
char maiden[25];
char MRN[25];
char city[25];
char state[25];
char phone1[25];
char phone2[25];
char email[25];
char alias[25];
};
bool loadDatabase(char *db_name) {
printf("Loading Database...");
char buffer[400];
FILE *fp;
int x;
fp = fopen(db_name, "wb"); //write & binary option
if (fp == NULL) {
puts(" ERROR: FILE CANNOT BE OPENED");
return false;
} else {
struct _record record;
while (fgets(rec, sizeof(rec), stdin) != NULL) {
value = strtok(NULL, ",");
flds[0] = strdup(value);
//load lname
value = strdup(NULL, ",");
flds[1] = strdup(value);
// load fname
value = strdup(NULL, ",");
flds[2] = strdup(value);
// load mname
value = strtok(NULL, "\n");
flds[3] = strdup(value);
// did not write the rest bc of the seg fault
strcpy(record.ID, flds[0]);
strcpy(record.lname, flds[1]);
strcpy(record.fname, flds[2]);
strcpy(record.mname, flds[3]);
strcpy(record.suffix, flds[4]);
strcpy(record.bday, flds[5]);
strcpy(record.gender, flds[6]);
strcpy(record.SSN, flds[7]);
strcpy(record.add1, flds[8]);
strcpy(record.add2, flds[9]);
strcpy(record.zip, flds[10]);
strcpy(record.maiden, flds[11]);
strcpy(record.MRN, flds[12]);
strcpy(record.city, flds[13]);
strcpy(record.state, flds[14]);
strcpy(record.phone1, flds[15]);
strcpy(record.phone2, flds[16]);
strcpy(record.email, flds[17]);
strcpy(record.alias, flds[18]);
}
printf("ID: %s", record.ID);
fwrite(record, sizeof(struct _record), 1, fp);
fclose(fp);
}
return true;
}
【问题讨论】:
-
是时候诚实地学习 gdb 了。
-
@MillieSmith 您的评论非常适用。您想记下以下链接吗?它们使像您这样的 cmets 更有帮助。 stackoverflow.com/questions/2069367/how-to-debug-using-gdbericlippert.com/2014/03/05/how-to-debug-small-programs
-
@Yunnosch 当我有像你这样的好队友时,为什么我自己要这样做;)。下次吧。感谢您的链接。 (老实说,虽然我们的朋友 Neal 应该可以 google gdb)。
-
value = strtok(NULL, ",");也许你想第一次打电话给rec而不是NULL。也许看看strtok的文档 -
fwrite(record, sizeof(struct _record),1,fp);也许你想使用&record而不是record。
标签: c database pointers strtok strcpy