我最近需要调试一些真正古老的旧代码,主要是为某些微控制器设计的。
在此代码中,所有printf调用均遵循相同的约定:
fprintf(outfile, "\r\nFormat %d", someinteger);
fflush(outfile);
您可以看到,代码首先显示NL(CR,代码是由Win98资深人士编写的),然后显示文本。最后,他手动刷新文件(有时stdout
,有时是正常的FILE*
)。
据我所知,这很费力,因为打印\n
已经刷新了句柄,所以下面的代码就足够了。
fprintf(outfile, "Format %d\r\n", someinteger);
与\n
暗示冲洗的第二个片段相比,有没有理由选择第一个片段来打印文本并手动冲洗手柄?
答案 0 :(得分:2)
作为使用Fortran IV,K&R C和Unix V7牛奶喂养的古老恐龙,我可以理解此代码。
首字母\r\n
确保在任何控制台模式下,光标都将定位在行的开头。作为一名经验丰富的串行控制台专家,我经常看到控制台处于原始模式,因为全屏(读取curses ...)程序崩溃了,并且无法恢复熟模式。而且我们必须键入stty sane ^J
(是 Ctrl + J 而不是 Return ,后者仅发送了无用的^M
)来恢复它。
如果可以将输出重定向到文件或管道,则fflush
之后的\n
仍然有意义。因为\n
之后的自动刷新仅在输出直接到达终端时才发生(在Unix / Linux中),而不是在输出到文件或管道时才发生。因此,我想说的是,该代码假定可能在相当恶劣的环境中使用,并且会尽力确保文本可读。