Beberapa seluk-beluk yang bermanfaat...
\33[2K
menghapus seluruh baris kursor Anda saat ini
\033[A
memindahkan kursor ke atas satu baris, tetapi di kolom yang sama yaitu tidak ke awal baris
\r
membawa kursor Anda ke awal baris (r adalah untuk carriage return N.B. carriage return tidak menyertakan baris baru sehingga kursor tetap berada di baris yang sama) tetapi tidak hapus apa pun
Khususnya di xterm, saya mencoba balasan yang disebutkan di atas dan satu-satunya cara yang saya temukan untuk menghapus baris dan memulai lagi dari awal adalah urutannya (dari komentar di atas diposting oleh @Stephan202 serta @vlp dan @mantal) \33[2K\r
Pada catatan implementasi, agar berfungsi dengan baik misalnya dalam skenario hitung mundur karena saya tidak menggunakan karakter baris baru '\n'
di akhir setiap fprintf()
, jadi saya harus fflush()
aliran setiap kali (untuk memberi Anda beberapa konteks, saya memulai xterm menggunakan garpu pada mesin linux tanpa mengarahkan ulang stdout, saya hanya menulis ke penunjuk FILE buffer fdfile
dengan deskriptor file non-pemblokiran saya telah duduk di alamat terminal semu yang dalam kasus saya adalah /dev/pts/21
):
fprintf(fdfile, "\33[2K\rT minus %d seconds...", i);
fflush(fdfile);
Perhatikan bahwa saya menggunakan urutan \33[2K untuk menghapus baris diikuti oleh \r
urutan carriage return untuk memposisikan ulang kursor di awal baris. Saya harus fflush()
setelah setiap fprintf()
karena saya tidak memiliki karakter baris baru di akhir '\n'
. Hasil yang sama tanpa perlu fflush() akan membutuhkan urutan tambahan untuk naik satu baris:
fprintf(fdfile, "\033[A\33[2K\rT minus %d seconds...\n", i);
Perhatikan bahwa jika Anda memiliki sesuatu di baris tepat di atas baris yang ingin Anda tulis, itu akan ditimpa dengan fprintf() pertama. Anda harus meninggalkan baris tambahan di atas untuk memungkinkan gerakan pertama naik satu baris:
i = 3;
fprintf(fdfile, "\nText to keep\n");
fprintf(fdfile, "Text to erase****************************\n");
while(i > 0) { // 3 second countdown
fprintf(fdfile, "\033[A\33[2KT\rT minus %d seconds...\n", i);
i--;
sleep(1);
}
Anda dapat menggunakan kode pelarian VT100. Sebagian besar terminal, termasuk xterm, mengetahui VT100. Untuk menghapus garis, ini adalah ^[[2K
. Dalam C ini memberikan:
printf("\33[2K\r");
Anda dapat menggunakan \r
(carriage return) untuk mengembalikan kursor ke awal baris:
printf("hello");
printf("\rbye");
Ini akan mencetak bye pada baris yang sama. Itu tidak akan menghapus karakter yang ada, dan karena bye lebih pendek dari halo , Anda akan berakhir dengan byelo . Untuk menghapusnya, Anda dapat membuat cetakan baru Anda lebih panjang untuk menimpa karakter tambahan:
printf("hello");
printf("\rbye ");
Atau, hapus terlebih dahulu dengan beberapa spasi, lalu cetak string baru Anda:
printf("hello");
printf("\r ");
printf("\rbye");
Itu akan mencetak halo , lalu pergi ke awal baris dan timpa dengan spasi, lalu kembali ke awal lagi dan cetak bye .