2016-09-28 3 views
3

\bの使い方を理解するための小さなC++プログラムを作成しました。プログラムは以下の通りです - だから、C++でendlと nでバックスペースを使用する

#include <iostream> 
using namespace std; 
int main(){ 
    cout << "Hello World!" << "\b"; 
    return 0; 
} 

、このプログラムは、バックスペースが一つだけのスペースバックカーソルを移動し!が印刷されていない理由buffer.So、からそれを削除していないため、所望の出力Hello World .Thisは発生しません提供します?今

、だから、別のプログ

#include <iostream> 
using namespace std; 
int main(){ 
    cout << "Hello World!" << "\b"; 
    cout << "\nAnother Line\n"; 
    return 0; 
} 

を考えてみましょう、ここでの出力がある - Hello World! Another Line なぜバックスペースはここで働いていないのですか?改行はバッファをフラッシュするべきではないので、!を削除する必要があります。ここで問題は何ですか?また

、私は\bendlまたは\nのいずれかを追加した場合、両方のケースでは、出力はHello World! .But、改行文字であるendlが出力の両方で同じであるか、buffer.Soをフラッシュし、一方、バッファをフラッシュしませんがケース?

+2

2つの間違った仮定があります:.1。 _ "これは、バックスペースがカーソルを1つのスペースだけ戻すために起こるべきではありません..." _。 2. _ "しかし、改行文字はバッファをフラッシュしません..." _後者は実装依存です。 –

+0

プログラムが終了すると、おそらく "!"を上書きするプロンプトが表示されます。プログラムが終了しても 'cout'はフラッシュされます。 '\ b'の仕組みは' C++ 'とは関係ありません。 'C++'はあなたがコンソールにそれを伝えるすべての文字を送信します。コンソールの動作はコンソールによって異なります。 – Galik

+0

@πάνταῥεSo、 '\ n'を使ってバッファをフラッシュできますか? –

答えて

-1

最初のプログラムの出力は次のようになりますか?

$ ./hello 
Hello World$ 

もしそうであれば、!がバッファから削除されません。シェルがプロンプトを表示したときにクラボッとします。

第2のプログラムに関して、バッファがフラッシュされるときには、\bがどのように処理されるのではなく、端末に送られるときにのみ影響を受ける。 \bはストリームの一部であり、端末はこれを "1つの列をバックアップする"という意味に解釈します。これが明確でない場合は、STDOUTに送信された実際のバイト数を見てみましょう:

$ ./hello2 | hexdump -C 
00000000 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 08 0a 41 6e |Hello World!..An| 
00000010 6f 74 68 65 72 20 4c 69 6e 65 0a     |other Line.| 
0000001b 

\bは、あなたのプログラムの中でcoutに書いたものに一致する、(それぞれ080a\nが続いています。

最後に、coutは、この例では\nまたはendlを渡すかどうかは関係ありませんので、プログラムが終了するとフラッシュされます。実際には、\nは、標準出力が端末に接続されているので、とにかくフラッシュされます。

関連する問題