【问题标题】:Backspace character not working when printing to a file [closed]打印到文件时退格字符不起作用[关闭]
【发布时间】:2013-05-13 23:02:50
【问题描述】:

我有简单的 C 程序-

main()
{
    printf("Foo\b");

}

它在终端上打印Fo(如预期的那样)。

但是当我通过重定向 I/O 来调用这个程序时-

./a.out >outfile

outfile 中写有Foo

为什么会这样?以及如何将退格字符设置为文件时将其打印到标准输出。


更新:请注意 - Foo 在输出文件中后跟一个空格。这是为什么呢?

【问题讨论】:

  • 我将假设您正在使用编辑器打开文件并且不明白编辑器不是终端并且控制字符是不可打印的?
  • 如果您查看stty -a 的输出,您可能会发现其中一个选项集是echoe,它会在“擦除”(通常是“退格”)时擦除前一个字符字符被输出。这将解释您看到的 Fo 输出。
  • "Foo 后面跟着一个空格在 outfile" -- 不,不是。
  • 你如何确定outfile 里面有Foo(这实际上是正确的;它应该包含Foo 后跟一个退格(不是空格);程序打印了一个退格,所以输出包含一个退格)。一种可能的工具是od -c outfile,它应该显示文件包含4 个字符,Foo'\b。在终端输入时发生的情况与将文件 cat 到终端时得到的输出无关。
  • @ShuklaSannidhya "what follow Foo" - 一个退格键,如果您真的注意收到的回复,您就会知道。 “我能看到的一切”——这与文件中的内容无关。让我们这样说吧:如果文件中真的有退格键,您会期望在“Foo”之后看到什么?提示:退格没有关联的字形,所以必须替换一些东西。

标签: c++ c gcc command-line


【解决方案1】:

计算机倾向于为每个字符使用不同的数字来表示文本 - 例如,使用 ASCII 约定,其中数值为 8 的字符是退格,大写字母从 65 开始,小写从 97 开始,等等......因此,您的程序正在生成四个输出字符:F、o、o 和退格 - 在屏幕上您只能看到 F 和 o,因为您的终端程序将退格解释为备份光标并删除最后写入的字符的命令。如果您使用其他程序检查 outfile,您可能仍会看到第二个 o 和退格:例如在 Linux 上您可以cat -vt outfile

文件没有将退格解释为删除较早文本的命令的概念,但如果稍后将文件连接到终端,它的操作应该与运行程序时的操作完全相同,而无需重定向到文件。

无论如何,如果你想备份,你需要使用文件命令来寻找一个字符,然后从那里截断或覆盖。它不能通过 shell 重定向来完成 - 您需要在程序中打开和控制文件。

【讨论】:

  • 同上。使用十六进制编辑器打开文件,您将看到所有不可打印和可打印的内容。
  • @ShuklaSannidhya - 不要将文件视为具有特殊含义的字符序列,也许您可​​以将文件视为字节序列。每个字节只是一个数字。每个数字都必须是可能的,否则某些文件将是不可能的。当某些东西解释这些字节时会发生特殊含义,但文件只是字节序列本身 - 它不会解释。
  • @Steve314 有趣的是,Foo 后跟在 outfile 中的一个空格。为什么\b 被解释为空格?
  • @ShuklaSannidhya - 根据您显示文件的方式,您可能会看到不同的内容。退格字符没有标准的可见表示 - 当它显示时,无论显示什么都必须发明一种方式。
  • @ShuklaSannidhya “Foo 后面跟着一个空格。” ——不,不是。 “为什么 \b 被解释为空间?” -- 因为您正在使用某些将非字形显示为空格的程序查看文件。
【解决方案2】:

如果您cat outfile,您将看到相同的结果,因为文件中包含退格控制字符,并且在终端上的行为与您期望的一样。正如 Brian 在 cmets 中提到的,文本编辑器可能会也可能不会对转义字符进行智能处理。

【讨论】:

  • 你没有回答我问题的第二部分...
  • 是的,我做到了。猫吧。然后它将转到标准输出。您在编辑器中看到的“空格”是退格字符。
猜你喜欢
  • 2018-06-04
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 2013-08-29
相关资源
最近更新 更多