我有简单的 C 程序-
main()
{
printf("Foo\b");
}
Fo
它在终端上打印(如预期的那样)。
但是当我通过重定向 I/O 来调用这个程序时-
./a.out >outfile
里面有outfile
写Foo
。
为什么会这样?以及如何将退格字符设置为文件时将其打印到标准输出。
更新:请注意 -Foo
后跟输出文件中的空格。这是为什么?
我有简单的 C 程序-
main()
{
printf("Foo\b");
}
Fo
它在终端上打印(如预期的那样)。
但是当我通过重定向 I/O 来调用这个程序时-
./a.out >outfile
里面有outfile
写Foo
。
为什么会这样?以及如何将退格字符设置为文件时将其打印到标准输出。
更新:请注意 -Foo
后跟输出文件中的空格。这是为什么?
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 重定向来完成 - 您需要从程序中打开和控制文件。
如果您cat outfile
将看到相同的结果,因为文件中包含退格控制字符,并且在终端上的行为与您期望的一样。正如布赖恩在评论中提到的那样,文本编辑器可能会或可能不会对转义字符做一些智能的事情。