如何从作为 fprintf 输出的 .csv 进行 fscanf
How to fscanf from a .csv which is a output of fprintf
我想 fscanf 一个 csv 文件,它是 fprintf 的输出,我设置了相同的格式但它不起作用,这意味着当我使用该函数 fscanf 我刚制作的文件时,它没有succuss,甚至没有进入 while 循环。那么,如何修改才能让它发挥作用呢?
下面是我的部分代码
fprintf 的一部分
fp = fopen("Out.csv", "w");
fprintf(fp, "%99s,%d,%99s,%99s\n", current->group, current->id, current->name,
current->address);
部分 fscanf
fp = fopen("Out.csv", "r");
while (fscanf(fp, "%99s,%d,%99s,%99s\n", group, &id, name, address) == 4) {
head = push_sort(head, group, name, id, address);
printf("%99s", name);
}
我怀疑是因为*scanf()
家族中的"%s"
说明符在发现白色space时停止扫描,你可以告诉fscanf()
忽略哪个特定字符,并且它将在该字符处停止。
我相信以下格式字符串可以工作
"%99[^,],%d,%99[^,],%99[^,\n]\n"
阅读 this link 以找出我认为该模式有效的原因,专门搜索 [
说明符。
*scanf()
函数很难,让它们正常工作总是很困难,尽管如果你正在生成该行并且你确定它包含什么并且不会发生意外,你可以相信它上班。
如果您检查 return 值,您将是安全的,所以如果您未能读取您认为有效的行,那么您可以尝试 fgets()
来自文件,并用 strchr()
或 strtok()
解析它,我更喜欢 strchr()
因为
- 不需要改变输入字符串。
- 它是线程安全和可重入的。
- 无需
strlen()
。 它可以让你推断更多,比如令牌的长度
我想 fscanf 一个 csv 文件,它是 fprintf 的输出,我设置了相同的格式但它不起作用,这意味着当我使用该函数 fscanf 我刚制作的文件时,它没有succuss,甚至没有进入 while 循环。那么,如何修改才能让它发挥作用呢?
下面是我的部分代码
fprintf 的一部分
fp = fopen("Out.csv", "w");
fprintf(fp, "%99s,%d,%99s,%99s\n", current->group, current->id, current->name,
current->address);
部分 fscanf
fp = fopen("Out.csv", "r");
while (fscanf(fp, "%99s,%d,%99s,%99s\n", group, &id, name, address) == 4) {
head = push_sort(head, group, name, id, address);
printf("%99s", name);
}
我怀疑是因为*scanf()
家族中的"%s"
说明符在发现白色space时停止扫描,你可以告诉fscanf()
忽略哪个特定字符,并且它将在该字符处停止。
我相信以下格式字符串可以工作
"%99[^,],%d,%99[^,],%99[^,\n]\n"
阅读 this link 以找出我认为该模式有效的原因,专门搜索 [
说明符。
*scanf()
函数很难,让它们正常工作总是很困难,尽管如果你正在生成该行并且你确定它包含什么并且不会发生意外,你可以相信它上班。
如果您检查 return 值,您将是安全的,所以如果您未能读取您认为有效的行,那么您可以尝试 fgets()
来自文件,并用 strchr()
或 strtok()
解析它,我更喜欢 strchr()
因为
- 不需要改变输入字符串。
- 它是线程安全和可重入的。
- 无需
strlen()
。 它可以让你推断更多,比如令牌的长度