【发布时间】:2018-01-23 16:57:22
【问题描述】:
我有这样的文件格式
1.9969199999999998 2.4613199999999997 130.81278270000001 AA
2.4613199999999997 2.5541999999999998 138.59131554109211 BB
2.5541999999999998 2.9953799999999995 146.83238401449094 CC
...........................
我必须将前三列读为float,最后一列读为C 中的char 数组。所有列都是制表符分隔的,每行末尾都有一个换行符。 fscanf(fp1, "%f\t%f\t%f\t%s\n", ...) 一切正常,直到我在每行末尾都有一些文本(字符字符串部分)。
在某些情况下,我在文件中有一个空字符串,而不是 AA/BB/CC。这种情况怎么处理。我尝试了fscanf(fp1, "%f\t%f\t%f\t%s[^\n]\n", ...) 和许多其他方法,但我无法找出正确的方法。你能帮帮我吗?
【问题讨论】:
-
别说“没用”,真的,真的烦人。而是说它做了你不希望它做什么,或者更具体地说,它没有做什么你确实想要它。
-
使用
float而不是double将丢弃显示的一半数字。float得到 6-7 个十进制数字;double得到 15 位以上的数字。 -
至于您的主要问题:使用
fgets()读取行,然后使用sscanf()解析读取的行。这样可以避免混淆。当输入是基于行但不够规则时,不要使用fscanf()和家人来读取数据——他们文件读取scanf()函数不关心换行符,即使你这样做。 (请注意,sscanf()将返回 3 或 4,表示行尾是否有字符串。始终测试来自scanf()和朋友的返回值 - 但要小心。) -
我,我不会使用任何 *scanf 系列来解决这类问题。我会使用
fgets读取整行,然后将每一行拆分为制表符分隔的字段。将一行拆分为字段(基于分隔符)很简单——您可以为此使用strtok或strsep。 (或见eskimo.com/~scs/cclass/notes/sx10h.html。) -
@tadman 很抱歉选错了词。编辑问题!感谢您指出:)
标签: c fileparsing