在我的程序的函数中,我尝试将文件中的数据加载到此结构数组中:
/* database struct */
typedef struct node {
char name[MAX];
char address[MAX];
long int number;
}record_type;
record_type record[100];
功能如下:
/* load database from disk */
void load_database() {
char line[128];
/* Set up database */
database = fopen("database.txt", "r+w+a+");
if(database == NULL) {
printf("\n\tWARNING: No database found.");
exit(1);
}
/* Get database file from disk */
while(fgets(line, sizeof(line), database) != NULL) {
sscanf(line, "%s %s %lu", record[rec_num].name,
record[rec_num].address, &record[rec_num].number);
/* keeps track of array size */
rec_num++;
}
}
我遇到的问题是与 sscanf 不一致。如果我包含名字和姓氏,我不能在它们之间放置空格,或者它将名字放在 name[] 中,将姓氏放在 address[] 中。
这是我尝试输入的数据示例:
1. Name: james manes Address: 220 test addr Number: 5558889999
我需要将“james manes”放入 name[] 字段,将 220 test addr 放入 address[] 字段,将 5558889999 放入结构的 number 字段。这可能吗?
是否有更有效的方法来管理此类输入?
最佳答案
scanf("%s"...
解析输入中以空格分隔的字符串,因此如果要解析的字符串中有空格,则它将不起作用。
虽然您可以使用正则表达式来获得您想要的内容,但由于您使用固定字符串作为标记,因此您可以使用 strstr
来提取字符串:
while(fgets(line, sizeof(line), database) != NULL) {
char *Name = strstr(line, "Name:");
char *Address = strstr(line, "Address:");
char *Number = strstr(line, "Number:");
if (Name && Address && Number) {
Name += strlen("Name:");
*Address = '\0';
Address += strlen("Address");
*Number = '\0';
Number += strlen("Number:");
strcpy(record[rec_num].name, Name);
strcpy(record[rec_num].address, Address);
sscanf(Number, "%lu", &record[rec_num].number);
rec_num++; } }
请注意,这也会引入名称和地址周围的所有空格 - 如果您希望更清晰,可以修剪掉前导和尾随空格。
关于C - 使用 fgets 和 sscanf 从文件加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13735886/