gpt4 book ai didi

c - 我应该分解 long scanf 以使其易于维护吗?

转载 作者:太空宇宙 更新时间:2023-11-04 06:14:06 24 4
gpt4 key购买 nike

我有一个包含固定宽度列的文件,这些列混合了 2 位和 4 位整数、一些 float 和字符串。都混在一起了。结果是跑出页面的 scanf 格式...

fscanf(file, "%2d%2d%2d%2d%4d%4d%4d%1s%1d%4d%1s%1d%4d%1s%1d%4d%1s%1d%4d%1s%1d%4d%1s%1d%4d%1s%1d%2d%1s%1d%2d%1s%1d%4d%1s%1d%4d%1s%1d%3d%1s%1d%4d%1s%1d%3d%1s%1d%3d%1s%1d%4d%1s%1d%5ld%1s%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%3d%1s%1d%3d%1s%1d%3d%1s%1d%2d%1s%1d",

这甚至不包括变量列表!

关于如何使其可维护的建议?我应该连续做几个 scanf 吗?或者在这种情况下是否有人们使用的规范解决方案?

更新:我在第一篇文章中包含了原始数据,但显然在编辑过程中将其剪掉了。有问题的数据称为 TMY2,您可以找到定义和示例格式字符串 here .还有一种更新的格式,TMY3,它使用 CVS,所以我有很多很好的例子来说明如何解析它。

最佳答案

file that has fixed-width columns that are a mix ....
how to make this maintainable ?

第 1 步,使用 fgets() 读入一个宽敞的缓冲区。不要使用 fscanf() @Andrew Henle

#define MY_BUF_N 400
char buf[MY_BUF_N * 2]; // make buffer 2x aticipated max size
if (fgets(buf, sizeof buf, file) == NULL) {
Handle_EOF_or_Error();
}

根据重复出现的模式识别组:

#define FMT_PRE "%2d%2d%2d%2d%4d%4d"
#define FMT_5 "%4ld%1s%1d"
#define FMT_4 "%4d%1s%1d"
#define FMT_3 "%4d%1s%1d"
#define FMT_2 "%4d%1s%1d"
#define FMT_MID "%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d"

使用字符串文字 连接。 @jxh

#define FMT_ALL FMT_PRE \
FMT_4 FMT_4 FMT_4 FMT_4 FMT_4 FMT_4 \
FMT_2 FMT_2 FMT_4 FMT_4 FMT_3 FMT_4 \
FMT_4 FMT_4 FMT_3 FMT_3 FMT_4 FMT_5 \
FMT_MID \
FMT_3 FMT_3 FMT_3 FMT_2

使用"%n"测试整个扫描是否成功

int n = 0;
sscanf(FMT_ALL " %n", ...
...
... /* variable list laid out like the format statements. */
...
&n);

测试n

// Did scan reach the end?
if (n == 0) {
Handle_incomplete_scan();
}
// Was there any remaining junk?
if (buf[n] != '\0') {
Handle_junk_at_the_end();
}

添加额外的测试来验证对象在范围内。


一般来说,我会重写。 @PeterJ_01在使用 fgets() 执行第 1 步之后,使用 strtol() 等辅助函数依次解析数据。

size_t i = 0;  // Index in buffer
if (parse_int(&object1, buf, &i, min_value, max_value)) error();
if (parse_int(&object1, buf, &i, min_value, max_value)) error();
...
if (parse_string(object7, sizeof object7, buf, &i)) error();
....
if (parse_long(&object12, buf, &i, min_value, max_value)) error();
...

关于c - 我应该分解 long scanf 以使其易于维护吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49804428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com