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) 的错误原因。我的代码有什么问题吗?我已经检查了几次文件内的文本,但它没问题,但无论如何都无法读取它。我可以提供一些帮助或一些有用的链接吗?如果您显示我可以在哪里阅读相关内容,我准备好自己管理它。
我对您的代码的测试表明正则表达式 %[^ ] 消耗了该行的其余部分,没有为变量 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
...
...