【发布时间】:2016-11-14 14:38:15
【问题描述】:
我有一个 txt 文件,我需要读取并填充一个链接列表。文件结构如下
IBE0101;2016;11;20;07;50;Alvaro;Carvajal;12345678R
IBE0101;2016;11;20;07;50;Juan;Garcia;12345678R
我正在尝试通过以下方式阅读它
tPassenger * ops_loadPassengersList()
{
tPassenger * retValue;
retValue = malloc(sizeof(tPassenger));
tPassenger *lastPassenger = retValue;
// Open file handle with read mode
FILE *file = fopen(OPS_PASSENGERS_FILE, "r");
// Loop until end of file
while(!feof(file)) {
tDateTime date;
fscanf(file, "%[^;];%d;%d;%d;%d;%d;%[^;];%[^;];%[^;]\n", lastPassenger->name, &date.year, &date.month, &date.day, &date.hour, &date.minute, lastPassenger->name, lastPassenger->surname, lastPassenger->dni);
printf(lastPassenger->name);
if(!feof(file)) {
lastPassenger->nextPassenger = malloc(sizeof(tPassenger));
lastPassenger = lastPassenger->nextPassenger;
}
}
// Close file handle
fclose(file);
return retValue;
}
但是,我被 fscanf 卡在无限循环中,找不到我告诉要扫描的内容?该模式似乎正确,第一次迭代工作正常。
tDateTime 元素没有用在这件作品上,但我也想得到它。
【问题讨论】:
-
您没有检查
fopen()、fscanf()或malloc()的返回值吗?你正在阅读lastPassenger->name两次。 -
好吧,我只是删除了一些行以使其清楚。是的,问题出在 fscanf 上,因为它在第一次迭代时返回 9(好),但在其余部分返回 0
-
与许多其他转换说明符相反,
[]不跳过空格。您可能无法匹配在 Windows 上处理数据文件时引入的第一行回车 (\r)...? -
所以添加 \n 不会告诉 fscanf 跳到新行吗?那我该怎么解决呢?我在赢是的。
-
(这就是为什么您应该使用
fgets()阅读整行并在内存中进行解析。众所周知,*scanf()在输入和格式字符串不正确的情况下无法为您提供适当的反馈'不同意。)
标签: c linked-list scanf