Saat membuat Aplikasi Konsol Windows di C #, apakah mungkin untuk menulis ke konsol tanpa harus memperpanjang baris saat ini atau pergi ke baris baru? Misalnya, jika saya ingin menunjukkan persentase yang menunjukkan seberapa dekat suatu proses dengan penyelesaian, saya hanya ingin memperbarui nilai pada baris yang sama dengan kursor, dan tidak harus meletakkan setiap persentase pada baris baru.
Apakah ini dapat dilakukan dengan aplikasi konsol C # "standar"?
Jawaban:
Jika Anda hanya mencetak
"\r"
ke konsol kursor kembali ke awal baris saat ini dan kemudian Anda dapat menulis ulang. Ini harus melakukan trik:Perhatikan beberapa spasi setelah nomor untuk memastikan bahwa apa pun yang ada di sana dihapus.
Perhatikan juga penggunaan
Write()
alih - alihWriteLine()
karena Anda tidak ingin menambahkan "\ n" di akhir baris.sumber
PadRight
(menyimpan string yang tidak ditambahkan, atau panjang, pertama, tentu saja).Anda dapat menggunakan
Console.SetCursorPosition
untuk mengatur posisi kursor dan kemudian menulis di posisi saat ini.Berikut adalah contoh yang menunjukkan "pemintal" sederhana:
Perhatikan bahwa Anda harus memastikan untuk menimpa output yang ada dengan output baru atau kosong.
Pembaruan: Karena telah dikritik bahwa contoh hanya memindahkan kursor kembali oleh satu karakter, saya akan menambahkan ini untuk klarifikasi: Menggunakan
SetCursorPosition
Anda dapat mengatur kursor ke posisi apa pun di jendela konsol.akan mengatur kursor ke awal baris saat ini (atau Anda dapat menggunakan
Console.CursorLeft = 0
langsung).sumber
SetCursorPosition
(atauCursorLeft
) memungkinkan untuk lebih banyak fleksibilitas, misalnya tidak menulis di awal baris, bergerak ke atas di jendela, dll jadi itu adalah pendekatan yang lebih umum yang dapat digunakan untuk misalnya output bilah progres kustom atau grafik ASCII.Sejauh ini kami memiliki tiga alternatif yang bersaing untuk bagaimana melakukan ini:
Saya selalu menggunakan
Console.CursorLeft = 0
, variasi pada opsi ketiga, jadi saya memutuskan untuk melakukan beberapa tes. Berikut kode yang saya gunakan:Di mesin saya, saya mendapatkan hasil berikut:
Selain itu,
SetCursorPosition
menyebabkan kedipan terlihat yang tidak saya amati dengan salah satu alternatif. Jadi, moralnya adalah menggunakan backspaces atau carriage return jika memungkinkan , dan terima kasih telah mengajari saya cara yang lebih cepat untuk melakukan ini, SO!Pembaruan : Dalam komentar, Joel menyarankan bahwa SetCursorPosition konstan terhadap jarak yang dipindahkan sementara metode lainnya linier. Pengujian lebih lanjut menegaskan bahwa ini adalah kasusnya, namun waktu yang konstan dan lambat masih lambat. Dalam pengujian saya, menulis string panjang spasi mundur ke konsol lebih cepat daripada SetCursorPosition hingga sekitar 60 karakter. Jadi backspace lebih cepat untuk mengganti bagian dari garis yang lebih pendek dari 60 karakter (atau lebih), dan itu tidak berkedip, jadi saya akan mendukung pengesahan awal saya dari \ b over \ r dan
SetCursorPosition
.sumber
Anda dapat menggunakan urutan escape \ b (backspace) untuk membuat cadangan sejumlah karakter tertentu pada baris saat ini. Ini hanya memindahkan lokasi saat ini, tidak menghapus karakter.
Sebagai contoh:
Di sini, baris adalah garis persentase untuk menulis ke konsol. Caranya adalah dengan menghasilkan jumlah \ b karakter yang benar untuk hasil sebelumnya.
Keuntungan dari ini selama \ r pendekatan adalah bahwa jika karya bahkan jika persentase output tidak di awal baris.
sumber
\r
digunakan untuk skenario ini.\r
mewakili carriage return yang berarti kursor kembali ke awal baris.Itu sebabnya Windows menggunakan
\n\r
sebagai penanda garis baru.\n
menggerakkan Anda ke bawah garis, dan\r
mengembalikan Anda ke awal garis.sumber
Saya hanya harus bermain dengan kelas divo
ConsoleSpinner
. Milik saya jauh dari ringkas, tetapi tidak cocok bagi saya bahwa pengguna kelas itu harus menuliswhile(true)
loop mereka sendiri . Saya memotret untuk pengalaman yang lebih seperti ini:Dan saya menyadarinya dengan kode di bawah ini. Karena saya tidak ingin
Start()
metode saya diblokir, saya tidak ingin pengguna harus khawatir tentang menuliswhile(spinFlag)
loop-like, dan saya ingin mengizinkan beberapa pemintal pada saat yang sama saya harus menelurkan utas terpisah untuk menangani pemintalan. Dan itu berarti kodenya harus jauh lebih rumit.Juga, saya belum melakukan banyak multi-threading sehingga mungkin (bahkan mungkin) bahwa saya telah meninggalkan satu atau tiga bug halus di sana. Tapi sepertinya itu bekerja cukup baik sejauh ini:
sumber
Secara eksplisit menggunakan Return Carrage (\ r) di awal baris daripada (secara implisit atau eksplisit) menggunakan Baris Baru (\ n) di akhir harus mendapatkan apa yang Anda inginkan. Sebagai contoh:
sumber
sumber
Dari dokumen Konsol di MSDN:
Jadi - saya melakukan ini:
Kemudian saya dapat mengontrol output sendiri;
Cara lain untuk sampai ke sana.
sumber
Ini berfungsi jika Anda ingin membuat file menghasilkan terlihat keren.
Dan ini adalah metode yang saya dapatkan dari beberapa jawaban di bawah dan memodifikasinya
sumber
Ini satu lagi: D
sumber
Jika Anda ingin memperbarui satu baris, tetapi informasinya terlalu panjang untuk ditampilkan pada satu baris, mungkin perlu beberapa baris baru. Saya mengalami masalah ini, dan di bawah ini adalah salah satu cara untuk menyelesaikannya.
sumber
saya sedang mencari solusi yang sama di vb.net dan saya menemukan ini dan itu bagus.
Namun seperti @JohnOdom menyarankan cara yang lebih baik untuk menangani ruang kosong jika yang sebelumnya lebih besar dari yang sekarang ..
saya membuat fungsi di vb.net dan berpikir seseorang bisa dibantu ..
ini kode saya:
sumber
Static intLastLength As Integer
.Saya sedang melakukan pencarian untuk melihat apakah solusi yang saya tulis dapat dioptimalkan untuk kecepatan. Yang saya inginkan adalah penghitung waktu mundur, bukan hanya memperbarui baris saat ini. Inilah yang saya pikirkan. Mungkin bermanfaat bagi seseorang
sumber
Terinspirasi oleh @ E.Lahu Solution, implementasi kemajuan bar dengan persentase.
sumber
Inilah pendapat saya tentang jawaban s soosh dan 0xA3. Itu dapat memperbarui konsol dengan pesan pengguna sambil memperbarui pemintal dan memiliki indikator waktu yang telah berlalu juga.
penggunaannya adalah seperti ini:
sumber
The
SetCursorPosition
Metode bekerja dalam multi-threading skenario, di mana dua metode lainnya tidaksumber