Saya tidak pernah bisa mengingat bagaimana saya melakukan ini karena ini jarang terjadi pada saya. Tetapi dalam C atau C ++, apa cara terbaik untuk membaca karakter dari input standar tanpa menunggu baris baru (tekan enter).
Idealnya, itu tidak akan menggemakan karakter input ke layar. Saya hanya ingin menangkap penekanan tombol tanpa mempengaruhi layar konsol.
c++
c
inputstream
Adam
sumber
sumber
Jawaban:
Itu tidak mungkin secara portabel dalam C + + murni, karena itu tergantung terlalu banyak pada terminal yang digunakan yang dapat dihubungkan dengan
stdin
(mereka biasanya line buffered). Namun, Anda dapat menggunakan perpustakaan untuk itu:conio tersedia dengan kompiler Windows. Gunakan
_getch()
fungsi ini untuk memberi Anda karakter tanpa menunggu tombol Enter. Saya bukan pengembang Windows yang sering, tetapi saya telah melihat teman sekelas saya hanya memasukkan<conio.h>
dan menggunakannya. Lihatconio.h
di Wikipedia. Ini daftargetch()
, yang dinyatakan usang dalam Visual C ++.kutukan tersedia untuk Linux. Implementasi kutukan yang kompatibel juga tersedia untuk Windows. Ini juga memiliki
getch()
fungsi. (cobaman getch
lihat manualnya). Lihat Kutukan di Wikipedia.Saya akan merekomendasikan Anda untuk menggunakan kutukan jika Anda bertujuan untuk kompatibilitas lintas platform. Yang mengatakan, saya yakin ada fungsi yang dapat Anda gunakan untuk mematikan penyangga baris (saya percaya itu disebut "mode mentah", sebagai lawan dari "mode yang dimasak" - lihat ke dalam
man stty
). Kutukan akan mengatasinya untuk Anda secara portabel, jika saya tidak salah.sumber
ncurses
adalah varian yang direkomendasikancurses
.Di Linux (dan sistem mirip-unix lainnya) ini dapat dilakukan dengan cara sebagai berikut:
Pada dasarnya Anda harus mematikan mode kanonik (dan mode gema untuk menekan gema).
sumber
read
. Saya telah memasukkan kedua header.error: ‘perror’ was not declared in this scope
saat dikompilasi, tetapi berfungsi dengan baik ketika disertakanstdio.h
bersamaunistd.h
.Saya menemukan ini di forum lain sambil mencari untuk menyelesaikan masalah yang sama. Saya telah memodifikasinya sedikit dari apa yang saya temukan. Ini bekerja dengan baik. Saya menjalankan OS X, jadi jika Anda menjalankan Microsoft, Anda harus menemukan perintah system () yang benar untuk beralih ke mode mentah dan matang.
sumber
#include <stdlib.h>
CONIO.H
fungsi yang Anda butuhkan adalah:
libconio http://sourceforge.net/projects/libconio
atau
Linux c ++ implementasi conio.h http://sourceforge.net/projects/linux-conioh
sumber
Jika Anda berada di windows, Anda dapat menggunakan PeekConsoleInput untuk mendeteksi jika ada input,
kemudian gunakan ReadConsoleInput untuk "mengkonsumsi" karakter input ..
sejujurnya ini dari beberapa kode lama yang saya miliki, jadi Anda harus bermain-main sedikit dengannya.
Yang keren adalah bahwa ia membaca input tanpa meminta apa pun, sehingga karakter tidak ditampilkan sama sekali.
sumber
Ini digunakan
kbhit()
untuk memeriksa apakah keyboard sedang ditekan dan digunakangetch()
untuk mendapatkan karakter yang sedang ditekan.sumber
Dengan asumsi Windows, lihat fungsi ReadConsoleInput .
sumber
C dan C ++ mengambil pandangan yang sangat abstrak tentang I / O, dan tidak ada cara standar untuk melakukan apa yang Anda inginkan. Ada cara standar untuk mendapatkan karakter dari aliran input standar, jika ada untuk mendapatkan, dan tidak ada lagi yang didefinisikan oleh kedua bahasa tersebut. Karena itu jawaban apa pun harus spesifik platform, mungkin tergantung tidak hanya pada sistem operasi tetapi juga kerangka kerja perangkat lunak.
Ada beberapa dugaan yang masuk akal di sini, tetapi tidak ada cara untuk menjawab pertanyaan Anda tanpa mengetahui apa lingkungan target Anda.
sumber
Saya menggunakan kbhit () untuk melihat apakah ada char dan kemudian getchar () untuk membaca data. Di windows, Anda dapat menggunakan "conio.h". Di linux, Anda harus mengimplementasikan kbhit () Anda sendiri.
Lihat kode di bawah ini:
sumber
Hal yang paling dekat dengan portable adalah menggunakan
ncurses
perpustakaan untuk meletakkan terminal ke "mode cbreak". API itu sangat besar; rutinitas yang paling Anda inginkaninitscr
danendwin
cbreak
dannocbreak
getch
Semoga berhasil!
sumber
Berikut ini adalah solusi yang diekstrak dari Pemrograman C Ahli: Rahasia Dalam , yang seharusnya bekerja pada SVr4. Menggunakan stty dan ioctl .
sumber
Saya selalu ingin loop membaca input saya tanpa menekan tombol kembali. ini bekerja untuk saya.
sumber
ncurses menyediakan cara yang bagus untuk melakukan ini! Juga ini adalah posting pertama saya (yang dapat saya ingat), jadi semua komentar sama sekali diterima. Saya akan menghargai yang bermanfaat, tetapi semuanya selamat datang!
untuk mengkompilasi: g ++ -std = c ++ 11 -pthread -lncurses .cpp -o
sumber
bekerja untuk saya di windows:
sumber
Anda dapat melakukannya dengan mudah menggunakan SDL (Simple DirectMedia Library), meskipun saya curiga Anda mungkin tidak menyukai perilakunya. Ketika saya mencobanya, saya harus membuat SDL membuat jendela video baru (walaupun saya tidak membutuhkannya untuk program saya) dan memiliki jendela ini "ambil" hampir semua input keyboard dan mouse (yang oke untuk penggunaan saya tetapi bisa menjengkelkan atau tidak bisa digunakan dalam situasi lain). Saya menduga itu berlebihan dan tidak layak kecuali portabilitas lengkap adalah suatu keharusan - jika tidak coba salah satu solusi yang disarankan.
Ngomong-ngomong, ini akan memberi Anda tombol tekan dan lepaskan acara secara terpisah, jika Anda menyukainya.
sumber
Berikut adalah versi yang tidak keluar ke sistem (ditulis dan diuji pada macOS 10.14)
sumber