从文件读取日期到链表

问题描述 投票:0回答:1
void readDataFromFile(President **h) {
    FILE *fp = fopen("President.txt", "r");
    if (fp == NULL) {
        printf("Не удалось открыть файл!\n");
        return;
    }

    char buffer[MAX];
    int rno, start_date, end_date;
    char name[MAX];

    while(fgets(buffer, MAX, fp) != NULL) {
        // Чтение данных из строки
        if (sscanf(buffer, "%d %[^\n] %d-%d", &rno, name, &start_date, &end_date) != 4) {
            printf("Ошибка при чтении строки из файла!\n");
            fclose(fp);
            return;
        }

        // Создание нового узла
        President *newNode = (President*)malloc(sizeof(President));
        if (newNode == NULL) {
            printf("Ошибка выделения памяти!\n");
            fclose(fp);
            return;
        }
        newNode->rno = rno;
        strcpy(newNode->name, name);
        newNode->start_date = start_date;
        newNode->end_date = end_date;
        newNode->next = NULL;

        // Добавление нового узла в список
        if (*h == NULL) {
            *h = newNode;
        } else {
            President* current = *h;
            while (current->next != NULL) {
                current = current->next;
            }
            current->next = newNode;
        }
    }

    fclose(fp);
    printf("Данные считаны из файла и записаны в список!\n");
}

你好。我试图从文件读取到链接列表,但我总是收到 if(sscanf) 的错误原因。我的代码有什么问题吗?我已经检查了几次文件内的文本,但它没问题,但无论如何都无法读取它。我可以提供一些帮助或一些有用的链接吗?如果您显示我可以在哪里阅读相关内容,我准备好自己管理它。

c linked-list scanf fgets
1个回答
0
投票

我对您的代码的测试表明正则表达式 %[^ ] 消耗了该行的其余部分,没有为变量 start_date 和 end_date 留下任何内容,这很可能是问题的根本原因。

我建议使用这个正则表达式:%[^]——它将在第一个空格处停止扫描:

sscanf(buffer, "%d %[^ ] %d-%d", &rno, name, &start_date, &end_date)

如果有 2 个由空格分隔的名称,您可以这样做来解决这种情况 - 请记住,在此示例中成功的 sscanf() 应返回 5:

sscanf(buffer, "%d %[^ ] %[^ ] %d-%d", &rno, fname, lname, &start_date, &end_date)

所有建议均已在具有此格式的数据文件上成功测试...显示版本 2(名字 + 姓氏):

1 第一 最后 1933-1944

2 第一 最后 1944-1948

...

...

© www.soinside.com 2019 - 2024. All rights reserved.