C - 使用 fgets 和 sscanf 从文件加载

标签 c input struct spaces scanf

在我的程序的函数中,我尝试将文件中的数据加载到此结构数组中:

/* 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/

相关文章:

c - qsort 函数导致问题

c - 驱动程序使用 inb() 和 outb() 访问端口

c - C中基于数组的队列逻辑

css - 输入焦点时更改背景位置 div

input - 为什么 Chrome 中输入类型 ="date"字段比输入类型 ="text"字段高 2 个像素?

python - 字典条目被覆盖?

将整数常量转换为指针类型

将数组转换为结构指针

c# - 为什么我不能将泛型类型的一个实例化转换为另一个实例化?

c - gtk+ 以编程方式在包含 vte 终端的scrolled_window 中向后滚动一行