如何解决Erlang代码中第二个io:format抛出的badarg错误?
问题分析与解决
错误原因
badarg错误源于格式字符串与参数类型不匹配。在printResult/5函数中,第二个io:format的格式字符串FormatD使用了浮点数格式符~f,但对应的Time_exec和Time_spawn是整数类型(由time_microseg/0返回的整数计算而来),Erlang的io:format要求格式符与参数类型严格对应,类型不匹配就会抛出badarg。
具体对应关系:
Time_exec = TimeEnd - TimeStart,time_microseg/0返回整数,因此Time_exec是整数,却对应格式符~-22fTime_spawn = SpawnEnd - SpawnStart,同样是整数,却对应格式符~-3f
修复方案
有两种直接可行的修复方式:
方式1:将整数参数转为浮点数
在调用io:format时,把整数参数转换为浮点数:
io:format(OutFile, FormatD, [size(Data), R, float(Time_exec), MBps, float(Time_spawn)]).
方式2:修改格式符适配整数
把格式字符串中的~f替换为~g(自动适配整数/浮点数格式),或者~w(打印任意Erlang项):
FormatD = "~-9w\t ~-13w\t ~-22g\t ~-11f\t ~-3g~n",
额外优化建议
time_microseg/0函数可改用erlang:monotonic_time(microsecond)替代now(),因为now()在Erlang 18+版本已被废弃,monotonic_time更可靠且性能更优:
time_microseg() -> erlang:monotonic_time(microsecond).
- 如果表头仅需写入一次,建议在打开文件时判断文件是否为空,避免每次运行重复写入表头。
内容的提问来源于stack exchange,提问作者Mery
相关产品推荐
相关产品推荐

