-6

私は単純なCプログラムを持っています-

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

}

端末に出力Foされます(予想どおり)。

しかし、I/O をリダイレクトしてこのプログラムを呼び出すと、

./a.out >outfile

と書いてありますoutfileFoo

なぜそうなのですか?ファイルに設定されているときにバックスペース文字を標準出力に出力するにはどうすればよいですか。


更新:注意Fooしてください - outfile ではスペースが続きます。何故ですか?

4

2 に答える 2

4

コンピュータは、文字ごとに異なる数字を使用してテキストを表す傾向があります。たとえば、数値 8 の文字はバックスペース、大文字は 65 から始まり、小文字は 97 から始まるという ASCII 規則を使用します。プログラムは、F、o、o、およびバックスペースの 4 文字の出力を生成しています。端末プログラムはバックスペースを、カーソルをバックアップして最後に書き込まれた文字を削除するコマンドとして解釈するため、画面には F と o しか表示されません。別のプログラムを使用して outfile を調べると、2 番目の o とバックスペースがまだ表示される場合があります。たとえば、Linux ではcat -vt outfile.

ファイルには、以前のテキストを削除するコマンドとしてバックスペースを解釈するという概念はありませんが、ファイルが後で端末に連結された場合、ファイルへのリダイレクトなしでプログラムを実行した場合とまったく同じように動作するはずです。

とにかく、バックアップしたい場合は、ファイル コマンドを使用して 1 文字をシークし、そこから切り捨てるか上書きする必要があります。シェルのリダイレクトでは実行できません。プログラム内からファイルを開いて制御する必要があります。

于 2013-05-19T05:41:32.850 に答える
0

cat outfileファイルにバックスペース制御文字が含まれており、端末で期待どおりに動作するため、同じ結果が表示される場合。Brian がコメントで述べたように、テキスト エディタはエスケープ文字を使って何か賢いことをするかもしれないし、しないかもしれません。

于 2013-05-19T05:39:54.163 に答える