如何从作为 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() 因为

  1. 不需要改变输入字符串。
  2. 它是线程安全和可重入的。
  3. 无需strlen()
  4. 它可以让你推断更多,比如令牌的长度