Miten saan tehtyä, että kun on vaikka pelissä valinta, 1,2 vai 3, että käyttäjä painaa vain 1, 2 tai 3, EIKÄ tarvitse painaa enteriä?
Kiitos...
"Keskustelu: C / C++ ja Delphi / Pascal: Merkin lukeminen ilman enteriä?"
Huomaatkos, että tämä foorumi on aika monelle ohjelmointikielelle? Jos nyt kertoisit, mitä ohjelmointikieltä tarkoitat?
Anteeksi, c++.
Ja löysin jo ehkä vastauksen:
char choice; cin >> choice; cin.ignore(INT_MAX,'\n'); cout << endl << endl;
Eipäs ollutkaan. Yhä apua kaivataan :S
Olio cin on suunniteltu lukemaan syötettä, joka ei välttämättä tule näppäimistöltä. Esimerkiksi voisit ajaa ohjelmasi näin:
ohjelma < data.txt
ja komentotulkki järjestäisi data.txt-tiedoston sisällön ohjelmalle syötteeksi. Ohjelma ei voi mitenkään tietää, että se tulee tiedostosta, eikä näppäimistöltä. Ero on tietenkin se, että jos ajat ohjelmaa konsolilta, se jää aina odottamaan syötettä, jos cin yrittää lukea, eikä puskurissa ole yhtään syötettä. Puskuriin pusketaan syötettä aina kun painetaan enteriä, joten et siitä enteristä pääse mitenkään eroon. (paitsi jos jossain systeemissä voi asettaa niin, että syöte menee heti puskuriin joka napin jälkeen)
Tuo <-merkintä toimii Unixin/Linuxin shelleissä ja DOSsissa sekä mahdollisesti muissakin systeemeissä. Vähän vastaavan vaikutuksen saa monissa graafisissa ympäristöissä, jos kiskoo data.txt-ikonin ohjelmaikonin päälle.
Yksittäisen näppäintenpainallusten lukemiseen tarvitset jonkin kirjaston, joka lukee matalan tason tietoja laitteistosta tai ottaa niitä vastaan käyttöjärjestelmän toimittamina. Oikean sellaisen osaamme neuvoa, kunhan kerrot millä systeemillä teet ohjelmaasi, jonka pitää lukea syötettä tällä tavalla. Käyttis ja kääntäjä nyt ainakin olisi hyvä tietää.
Esimerkiksi vanhan Turbo C -kääntäjän mukana tuli conio.h-otsikkotiedosto, jossa oli iki-ihana kbhit()-funktio. Se palauttua true (tai 1), kun näppäintä oli painettu, ja se näppäintieto oli luettavissa getch()-kutsulla sen jälkeen. Jos puskuri oli tyhjä, getch() juuttui odottamaan, että näppäintä painetaan. Mutta se on viime vuosituhannen juttuja.
Yksinkertaisemmin ilman pitkiä ja hankalia selityksiä: ei onnistu pelkällä alustariippumattomalla C++:lla. Tarvitset jotakin tukevampaa, kuten ncurses- taikka PDCurses-kirjaston. Aiheesta kertoo lisää ncurses-opas.
Aihe on jo aika vanha, joten et voi enää vastata siihen.