いきなり本題です
cpp
1std::cout << "Hello Golang" << std::endl;
こうすると当たり前ですがコンソール上に Hello Golang
と表示されますよね
これを表示させた後に例えば Hello C++
に変更する方法を知りたいです
次の行に付け足すのではなく、Golang
を消してそこに代わりにC++
を入れる方法です!!!!
知恵をお貸しください!!!!
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
コンソールが対応していれば、エスケープシーケンスを利用することで実現できます(大抵対応してると思います)。
ANSIエスケープシーケンス チートシート
\e[
で始まる文字列で命令を送り込むことにより、コンソールの内容をより自由に操作することができます
cpp
1#include <iostream> 2 3int main(){ 4 std::cout << "Hello Golang"; 5 std::getchar(); 6 std::cout << "\e[1A\e[6CC++\e[K" << std::endl; 7}
このコードは、実行すると
Hello Golang
となり(カーソルはGolangの次)、Enterを押すと
Hello C++
に書き換わり終了します。エスケープシーケンスのそれぞれの命令が何をやっているかは、冒頭に貼ったページを見るなどしてみてください。
\e
は\033
にしないと動かない環境もあるようです。
(getcharで一時停止することの是非については無視しています)
投稿2020/05/21 19:16
総合スコア147
0
標準出力は、C++言語自体が扱う範囲の外側の世界です。普通はOSかな。で、それを表示するのはまた別のデバイスのお仕事です。
つまり、「C++で」なにか出来る話ではなくて、OSに、そして表示デバイスに、文字を消して表示し直すような機能があればそれをC++から使うんだ、ということはしっかり押さえておく必要があります。
太古の昔には出力デバイスはプリンターでした。キーボードとセットで「テレタイプ」。紙に書いちゃうんだから「出した文字を消す」なんてことは出来ませんね。印字しちゃったんだから。このとき使われたインターフェースがRS232Cなので、unix系ではシリアルデバイスにttyナンチャラというデバイス名が使われているのが名残。
余計なことを言えば、「標準入力」とか「標準出力」なんて考え方も、入出力装置が別体だったこの辺から来ているのでしょう。
時代が少し下がって、文字だけならなんとか画面上に表示出来る時代になります。キャラクタ端末とか(この呼び方は「グラフィック端末(グラタン)」があってこそのもの(キャラタン)なんだけど、当時はなんていってたのかな。)
この時期に売れたVT-100等で搭載されたのが「エスケープシーケンス」。画面をクリアしたりとか、表示位置を変える機能を出力する文字列に混ぜ込んで実現したもの。以降、これがそういう操作の標準となりました。端末装置が別体じゃなくなって、端末プログラムとかコマンドプロンプトとか呼ばれる様になっても、この機能は引き継がれました。Windowsでも95あたりまでは(一部手続きは必要だけど)使えたんだけど...Windows10になって(これも一部手続きは必要だけど)復活してきたりしています。
いろいろ機能はあるので'エスケープシーケンス カーソル位置'とかでググってみて下さい。単にエスケープシーケンスだけだと、「文字列中に何かを埋め込む操作」一般論が結構入ってきてしまうので。
Windowsでエスケープシーケンスが使えない場合はWin32APIで操作します。こちらも'Win32API カーソル位置'とかでググればなんとかなるかと。
投稿2020/05/21 23:52
編集2020/05/21 23:53総合スコア7703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
同じ行を書き直せばいいんですよね。
C++
1#include <iostream> 2 3#if defined(_WIN32) || defined(_WIN64) 4#include <windows.h> 5 6void sleep3() { 7 std::cout << std::flush; 8 Sleep(3000); 9} 10#else 11#include <unistd.h> 12 13void sleep3() 14{ 15 std::cout << std::flush; 16 timeval t = { 3 }; 17 select(0, nullptr, nullptr, nullptr, &t); 18} 19#endif 20 21int main() 22{ 23 std::cout << "Hello Golang"; 24 sleep3(); 25 std::cout << "\rHello C++ "; 26 sleep3(); 27 std::cout << "\n"; 28}
追記
C
1#include <windows.h> 2#include <stdio.h> 3#include <stdlib.h> // system 4 5int main(void) 6{ 7 system("cls"); 8 9 HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); 10 puts("1. apple \n" "2. orange\n" "3. grape "); 11 Sleep(2000); 12 13 COORD coord = { 0, 1 }; 14 SetConsoleCursorPosition(h, coord); 15 puts("5. banana"); 16 Sleep(2000); 17 18 coord.Y = 0; 19 SetConsoleCursorPosition(h, coord); 20 puts("7. peach "); 21 Sleep(2000); 22 23 coord.Y = 3; 24 SetConsoleCursorPosition(h, coord); 25}
投稿2020/05/22 01:24
編集2020/05/22 05:00総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/05/22 04:17
2020/05/22 06:01
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/21 20:13
2020/05/22 01:57 編集
退会済みユーザー
2020/05/22 06:13