C语言 读取选项卡,逐行分隔内容,最后一列为空字符串



我有这样的文件格式

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, "%ft%ft%ft%sn", ...)工作正常,直到我在每行的末尾有一些文本(字符字符串部分)。

在某些情况下,我在文件中有一个空字符串,而不是 AA/BB/CC。如何处理这种情况。我尝试过fscanf(fp1, "%ft%ft%ft%s[^n]n", ...)和许多其他事情,但我无法找出正确的方法。你能在这里帮我吗?

使用float而不是double会丢弃大约一半的显示数字。你会得到 6-7 个十进制数字和float;你得到 15+ 位数字与double.

至于你的主要问题:使用fgets()(或POSIX)getline()) 读取行,然后sscanf()分析读取的行。这将避免混淆。 当输入是基于行但不够规则时,不要使用fscanf()和 family 来读取数据 — 文件读取scanf()函数不关心换行符,即使你这样做也是如此。

请注意,sscanf()将返回 3 或 4,指示行尾是否有字符串(或EOF012如果给定一个空字符串,或者一个不以数字开头的字符串,或者一个只包含一个或两个数字的字符串)。始终测试来自scanf()和朋友的返回值 - 但要小心。 查找所需的值数(在本例中为 3 或 4),而不是"非 EOF"。

这大致导致:

#include <stdio.h>
int main(void)
{
double d[3];
char text[20];
char line[4096];
while (fgets(line, sizeof(line), stdin) != 0)
{
int rc = sscanf(line, "%lf %lf %lf %19s", &d[0], &d[1], &d[2], &text[0]);
if (rc == 4)
printf("%13.6f  %13.6f  %13.6f  [%s]n", d[0], d[1], d[2], text);
else if (rc == 3)
printf("%13.6f  %13.6f  %13.6f  -NA-n", d[0], d[1], d[2]);
else
printf("Format error: return code %dn", rc);
}
return 0;
}

如果将此文件作为标准输入:

1.9969199999999998  2.4613199999999997  130.81278270000001  AA
2.4613199999999997  2.5541999999999998  138.59131554109211  BB
2.5541999999999998  2.9953799999999995  146.83238401449094  CC
19.20212223242525  29.3031323334353637 3940.41424344454647
19.20212223242525  29.3031323334353637 3940.41424344454647  PolyVinyl-PolySaccharide

输出为:

1.996920       2.461320     130.812783  [AA]
2.461320       2.554200     138.591316  [BB]
2.554200       2.995380     146.832384  [CC]
19.202122      29.303132    3940.414243  -NA-
19.202122      29.303132    3940.414243  [PolyVinyl-PolySacch]

您可以调整输出格式以适合自己。 请注意,即使文本长度超过 19 个字符,%19s也会避免缓冲区溢出。

相关内容

  • 没有找到相关文章

最新更新