这个小的 printf 循环似乎不知从哪里发出了一个额外的字节,为什么?

This small printf loop emits one extra byte seemingly out of nowhere, why?

这个自包含的程序,当 运行 与 windows 命令行(即 test.exe > test.txt)时,由于我无法理解的原因发出一个额外的字节。

#include <stdio.h>

int main() {
    int N = 50;
    for (int i = 0; i < N; ++i)
        printf("%c%c%c", (int)(i / (float)N * 255), 0, 255);
}

人们期望 test.txt 有 150 个字节,但它有 151 个。用十六进制编辑器查看它,您可以看到:

0000 ff05 00ff 0d0a 00ff 0f00 ff14 00ff     
1900 ff1e 00ff 2300 ff28 00ff 2d00 ff33
00ff 3800 ff3d 00ff 4200 ff47 00ff 4c00
ff51 00ff 5600 ff5b 00ff 6000 ff66 00ff
6b00 ff70 00ff 7500 ff7a 00ff 7f00 ff84
00ff 8900 ff8e 00ff 9300 ff99 00ff 9e00
ffa3 00ff a800 ffad 00ff b200 ffb7 00ff
bc00 ffc1 00ff c600 ffcc 00ff d100 ffd6
00ff db00 ffe0 00ff e500 ffea 00ff ef00
fff4 00ff f900 ff

循环的第三次迭代似乎是发出四个字节的罪魁祸首:0d0a00ff。我一辈子都弄不明白为什么会这样。我用 Visual Studio 2015 编译了这个,以防万一。

(int)(2 / (float)5 * 255) 是 10,这是换行符的 ASCII 表示,Windows 转换为它的正常 CRLF 表示。

据我所知,没有办法避免这种行为(freopen 在 Windows 上有限制),但是看到你想写二进制数据,使用 text-formatting function printf 和标准输出可能不是理想的方法。