void readDataFromFile(President **h) {
    FILE *fp = fopen("President.txt", "r");
    if (fp == NULL) {
        printf("Cannot open a file!\n");
        return;
    }

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

    while(fgets(buffer, MAX, fp) != NULL) {
        // Reading data from line
        if (sscanf(buffer, "%d %[^\n] %d-%d", &rno, name, &start_date, &end_date) != 4) {
            printf("Error trying to read file!\n");
            fclose(fp);
            return;
        }

        // Creating of new node
        President *newNode = (President*)malloc(sizeof(President));
        if (newNode == NULL) {
            printf("Memory error!\n");
            fclose(fp);
            return;
        }
        newNode->rno = rno;
        strcpy(newNode->name, name);
        newNode->start_date = start_date;
        newNode->end_date = end_date;
        newNode->next = NULL;

        // Adding new node to list
        if (*h == NULL) {
            *h = newNode;
        } else {
            President* current = *h;
            while (current->next != NULL) {
                current = current->next;
            }
            current->next = newNode;
        }
    }

    fclose(fp);
    printf("Data is added to list!\n");
}

你好.我试图从一个文件读到另一个链表,但我总是得到一个错误原因if(Sscanf).我的代码出了什么问题?我已经判断了几次文件中的文本,但它是好的,但无论如何都不能读它.我能有一些帮助或一些有用的链接吗?如果你告诉我我可以在哪里读到它,我准备自己管理它.

以下是输入文件中的三条采样线

1 President 2000-2004 
2 President 1932-1957 
3 President 2012-2016

推荐答案

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

我建议使用以下正则表达式:%[^]--它将在第一个空白处停止扫描:

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

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

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

注:@Weather Vane非常亲切地指出,%S将取代%[^]工作.是的,当然!(再次感谢).

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

1 First Last 1933-1944
2 First Last 1944-1948
...
...

C++相关问答推荐

如果实际的syscall是CLONE(),那么为什么strace接受fork()呢?

如何在C宏中确定Windows主目录?

为什么在4.9.37版的内核中,kfio还需要smp_wmb呢?

如何一次获取一个字符

GCC预处理宏和#杂注GCC展开

在传统操作系统上可以在虚拟0x0写入吗?

有什么方法可以将字符串与我们 Select 的子字符串分开吗?喜欢:SIN(LOG(10))

tick.q中的Kdb+键控表语法

为什么我从CSV文件中进行排序和搜索的代码没有显示数据的所有结果?

C语言中奇怪的输出打印数组

生产者消费者计数器意外输出的C代码

如何修复我的qsort()算法?它每次都给出不同的结果

基于蝶数恰好有8个除数的事实的代码

OMP并行嵌套循环

模仿 memmove 的行为

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

通过修改c中的合并排序对数组的偶数索引进行排序

为什么使用 C 引用这个 char 数组会导致 Stack smasing?

Zig 中 C 的system函数的惯用替代方案

为什么这里的符号没有解析?