本文是「CLAD 例题精讲 · 第 20 讲」系列之一。第 20 讲的核心问法是:写入之后,文件里到底是什么字符。这道题考的更刁钻一点:同一个数,用不同的格式字符串写进去,文件大小都不一样。
01 题目
NI Daily CLAD 2012-09-03。两个程序框图:都从 Open/Create/Replace File 开始,都往 c:\temp 下写文件,输入的都是同一个浮点数常量 9.99,都用 Format Into File。唯一的区别是格式字符串:上面写的是 %d ,下面写的是 %f。
问:两个文件的大小关系是什么?
- a) steve1.txt 和 steve2.txt 一样大
- b) steve1.txt 比 steve2.txt 大
- c) steve1.txt 比 steve2.txt 小
- d) 两个文件都因出错而没有被创建

题面:格式字符串一个 %d 一个 %f,输入都是 9.99(NI Daily CLAD 2012-09-03)
02 答案
C。用 %d 写的 steve1.txt 更小。
03 为什么
Format Into File 的本质是:先把数据按格式字符串格式化成文本,再把这段文本写进文件。所以文件的大小,就是格式化结果字符串的长度。
- %d 把浮点数 9.99 格式化成整数文本:不是截断,是四舍五入 ,9.99 变成
"10"------2 个字符。 - %f 默认输出 6 位小数:9.99 变成
"9.990000"------8 个字符。
2 个字符对 8 个字符,差 6 个字节。steve1.txt 小,答案 C。
这里有一个很多老手都会愣一下的点:%d 遇到浮点数不是砍掉小数,而是四舍五入。9.99 变 "10",9.49 变 "9"。要是按"截断"去算,9.99 就该变 "9",答案就选反了------这正是出题人把 9.99 而不是 9.4 放进题面的原因。
04 容易栽的坑
坑一:拿数值大小当文件大小。 9.99 比 10 "更精确",直觉上似乎该更长;但文件里存的是格式化后的字符,"10" 就 2 个字节,谁也拦不住。
坑二:以为 %f 固定是 "9.99" 原样输出。 %f 不带精度说明时默认 6 位小数,9.99 会变成 9.990000。想输出 9.99 得自己写 %.2f。
坑三:以为写入的是"数字"。 走 Format Into File 这条路,写进去的从头到尾都是文本。文件里没有数值类型这回事,只有字符。
05 工程里怎么用
日志和报表用 %f,并且显式给精度。 %.3f 输出固定位数的小数,列对齐、好复查;不写精度,默认 6 位既可能太长也可能不够。
要机器再读回来的,别用文本绕一圈。 需要无损往返的数值,用二进制文件写 DBL,8 个字节原样进出,不存在格式化损失;文本格式留给给人看的报表。
算文件大小之前,先把格式化结果在字符串里演一遍。 Format Into String 和 Format Into File 用的是同一套格式字符串,拿前者把结果摆出来看一眼,文件多大就一目了然。
一句话总结:Format Into File 写进去的是字符不是数,%d 四舍五入、%f 默认 6 位小数------文件大小就是那段文本的长度。