#include <limits.h>
#include <stdio.h>
#define FIELD_COUNT 20
enum Kind {
String,
Int,
Float,
};
union Value {
const char* s;
int i;
float f;
};
struct Tagged_Union {
enum Kind kind;
union Value value;
};
void print_field(struct Tagged_Union tg)
{
switch (tg.kind) {
case String:
// to keep with the RFC4180 "standard," this is
// incorrect, but may not matter for your use case.
printf("%s", tg.value.s);
break;
case Int:
printf("%d", tg.value.i);
break;
case Float:
printf("%f", tg.value.f);
}
}
int main()
{
struct Tagged_Union tg[FIELD_COUNT];
// fill in your data
int i = 0;
for (; i < FIELD_COUNT; ++i) {
if (!i) {
printf(",");
}
print_field(tg[i]);
}
printf("\n");
}
2条答案
按热度按时间xmq68pz91#
这看起来像是tagged union的一个作业。下面是一个如何写入更多动态记录的示例。
这将只打印一条记录,但我希望您可以看到如何将其应用于您的用例。
iszxjhcz2#
每个值都可以通过单独调用
fprintf()
来写入。除非您确定字符串元素不需要特殊处理(参见https://www.rfc-editor.org/rfc/rfc4180),否则您应该实现一个函数(下面称为fprintfCsvString()
)来正确处理字符串元素,即如果需要,用双引号括起来,并转义双引号字符。编写每一个CSV行可能如下所示:
(the
fprintfCsvString()
的实施不在本问题/答案的范围内)