-6

我有简单的 C 程序-

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

}

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

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

./a.out >outfile

里面有outfileFoo

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


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

4

2 回答 2

4

Computers tend to represent text using distinct numbers for each character - for example, using the ASCII convention in which the character with numeric value 8 is a backspace, upper case letters start from 65, lower case from 97 etc.... So, your program is generating four characters of output: F, o, o and backspace - on screen you only see F and o because your terminal program interprets the backspace as a command to back up the cursor and remove the last-written character. If you inspect outfile using another program, you may still see the second o and backspace: for example on Linux you could cat -vt outfile.

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

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

于 2013-05-19T05:41:32.850 回答
0

如果您cat outfile将看到相同的结果,因为文件中包含退格控制字符,并且在终端上的行为与您期望的一样。正如布赖恩在评论中提到的那样,文本编辑器可能会或可能不会对转义字符做一些智能的事情。

于 2013-05-19T05:39:54.163 回答