Vložení editovatelného textu do konzole v C++

Vložení editovatelného textu do konzole v C++
« kdy: 22. 02. 2020, 22:44:15 »
Ahoj, můžu k tomuto scriptu (nebo jinému) přidat nějaký text, který se vloží do terminálu pokud zavolám tento kód?
Příklad, spustím tento kód a vytiskne se
Zadejte vaše jméno:
chci aby se vytisklo
Zadejte vaše jméno:Petr
a přitom ten text Petr za dvoutečku aby šel v rom řádku editovat.

Kód: [Vybrat]
string name ;
cout << "Zadejte vaše jméno:";
getline(cin, name ) ;
cout << "Hello " << name << endl ;


Díky
« Poslední změna: 23. 02. 2020, 08:58:04 od Petr Krčmář »


xyz

  • ***
  • 233
    • Zobrazit profil
Ahoj, můžu k tomuto scriptu (nebo jinému) přidat nějaký text, který se vloží do terminálu pokud zavolám tento kód?
Příklad, spustím tento kód a vytiskne se
Zadejte vaše jméno:
chci aby se vytisklo
Zadejte vaše jméno:Petr
a přitom ten text Petr za dvoutečku aby šel v rom řádku editovat.

Kód: [Vybrat]
string name ;
cout << "Zadejte vaše jméno:";
getline(cin, name ) ;
cout << "Hello " << name << endl ;


Díky

Neni jednodussi vypsat "Zadejte vase jmeno (Petr):" A pokud uzivatel to odbouchne entrem, jmeno bude Petr, jinak vstup z console?  :-)

Neni jednodussi vypsat "Zadejte vase jmeno (Petr):" A pokud uzivatel to odbouchne entrem, jmeno bude Petr...

Tak to nechci

.. jinak vstup z console?  :-)
??


šimrá mě v zátylku ungetc() .

šimrá mě v zátylku ungetc() .

Nevím jestli jsi to pochopil, hledám způsob jak je to tady, Po spuštění se hned vloží text který v tom řádku můžu editovat. Je to ukázka z pythonu.
https://i.stack.imgur.com/8ikmg.gif


_Jenda

  • *****
  • 1 592
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
knihovna readline - hmm, je pod GPL, ale našel jsem https://github.com/antirez/linenoise

knihovna ncurses

je to opruz a jeden z důvodů, proč preferuji psát programy v Pythonu a když potřebuju něco céčkového (lowlevel nebo výkon), tak z toho vyrobím modul přes CFFI

možná by šlo použít program rlwrap nebo rlfe (ten mi teď poradilo apt), který ti to tam dodělá
« Poslední změna: 23. 02. 2020, 00:34:33 od _Jenda »

knihovna readline - hmm, je pod GPL, ale našel jsem https://github.com/antirez/linenoise

knihovna ncurses

je to opruz a jeden z důvodů, proč preferuji psát programy v Pythonu a když potřebuju něco céčkového (lowlevel nebo výkon), tak z toho vyrobím modul přes CFFI

možná by šlo použít program rlwrap nebo rlfe (ten mi teď poradilo apt), který ti to tam dodělá

Jenže v Pythonu z toho ve výsledku neudělám jeden přenositelný soubor, tam kde to budu chtít spustit musím všechno nainstalovat. A ta ukázka taky není běžně v knihovně, musí se doinstalovat kdo ví co všechno :(

PS jedná se mi o Windows terminál

Tady jsem něco našel, ale nejde mi to, třeba na to nějaký profík mrkne..

Kód: [Vybrat]
https://stackoverflow.com/questions/2496857/is-there-a-function-in-c-that-does-the-same-as-raw-input-in-python

bmn

  • ***
  • 167
    • Zobrazit profil
    • E-mail
...
https://i.stack.imgur.com/8ikmg.gif
Popisované chování není standardní chování konzole (ani na unix ani na win). Je proto nutné konzoli značně přiohnout. Pro windows bych doporučil  API funkci "WriteConsoleInput" která umožňuje podstrčit konzoli sekvenci událostí (stisk klávesy, stisk myši, ...) tak, jako by danou věc prováděl uživatel.

Tedy vypsat záhlaví textu a pak těsně před čtením poslat sekvenci via WriteConsoleInput, kterou chcete mít jako default, sekvenci emulující stisk kláves (možná vč. puštění jednotlivých kláves, prostě přesná emulace mačkání kláves uživatele) předdefinovaného textu (BEZ klávesy ENTER!).

Následné čtení vstupu z (bufferu) konzole, např. pomocí standardní c++ getline, by se mělo chovat podobně jako v ukázce ... nebude totiž ani tušit, že default text je tam uměle přidaný, bude se jevit, jako by jej právě zadal člověk.

tecka

  • ***
  • 147
    • Zobrazit profil
    • E-mail
Já myslím, že to, co jsi našel, funguje stejně, jako to, co jsi už měl. A pokud ne, tak napiš, co ti na tom nefunguje.

Mám za to, že Windowsí konzole je standardně v řádkovém režimu a dokud vstup nepotvrdíš Enterem, tak můžeš text editovat Backspacem pro odmazávání textu od konce.

Věř mi, že nic víc nepotřebuješ a pokud si myslíš, že ano, tak si to musíš napsat sám, nebo použít kód-knihovnu někoho jiného, protože Céčko ve standardní knihovně samozřejmě neřeší to, jak ve Windows funguje konzole a funkce pro čtení neobsahují textový editor.

šimrá mě v zátylku ungetc() .

Nevím jestli jsi to pochopil, hledám způsob jak je to tady, Po spuštění se hned vloží text který v tom řádku můžu editovat. Je to ukázka z pythonu.
https://i.stack.imgur.com/8ikmg.gif

...asi nakonec souhlasím. Našel jsem zmínku, že ungetc() třeba v GLibc vezme jenom jeden znak. A pokud by vzala víc, tak si nejsem jistý, jak by to interagovalo s kanonickým režimem terminálu - možná by se ty znaky neobjevily dřív, než by terminál dostal newline? Nebo by je dostal zpátky čtoucí program okamžitě, ale neobjevily by se už na terminálu... A v nekanonickém znakovém režimu by to stejně bylo celé na Vás (číst znak po znaku a echovat podle svého).

Pokud se Vám nechce, napsat si to po svém se základním ovládáním terminálu (vstup po znacích, na obrazovku opakovaně mazat a zobrazovat celý řádek), a ncurses nejsou to pravé ořechové (lze používat pod Windows díky MinGW) tak už mě napadá jenom samá ještě těžší tonáž.

V linuxovém světě bych zmínil knihovničku libnewt (download) od RedHatu. (Koukám dnešní maintainer je M.Lichvář.) Potkal jsem ji před lety a dodnes se nezměnilo, že widget na vstup textu existuje pouze jednořádkový, nemá multiline editační okno. A není pro Win32.

Anebo taky Turbovision ;-)

Readline/linenoise... mi připadá, že vedou někam trochu jinam, a Váš problém možná vůbec neřeší.

Nadnesl jste skutečně zapeklitý problém :-D

...koukám neexistuje na ANSI terminálu escape sekvence, která by v kanonickém módu vložila pár znaků na aktuálně editovaný řádek :-( Takže jediná šance je terminál ve znakovém (raw) módu a napsat si to po svém.

Ink

  • *****
  • 667
    • Zobrazit profil
    • E-mail
Jenže v Pythonu z toho ve výsledku neudělám jeden přenositelný soubor, tam kde to budu chtít spustit musím všechno nainstalovat. A ta ukázka taky není běžně v knihovně, musí se doinstalovat kdo ví co všechno :(

To ale neni pravda: https://lmgtfy.com/?q=single+executable+python

Re:Vložení editovatelného textu do konzole v C++
« Odpověď #13 kdy: 23. 02. 2020, 09:56:24 »
Terminál ve základním módu funguje takhle: https://www.reddit.com/r/HistoryPorn/comments/2p95hn/microsoft_founders_bill_gates13_and_paul_allen15/, takže toho moc neumí. Rozhodně neumí to, co chceš ty.

Pokud od něj chceš víc, použij ncurses.

Pokud od něj chceš ještě víc, buď si to naprogramuj sám, nebo použij jiný jazyk, kde to už někdo udělal za tebe, například Python.

Pokud se chceš něco naučit, sežeň si knížku Dialog s počítačem od Vejmoly a Becka, důkladně jí prostuduj (protože v češtině nic lepšího asi nenajdeš), a pak se řiď radou od ondrama ;)

Takhle nějak by to šlo udělat v Céčku, což je ještě o level níž než C++:
Kód: [Vybrat]
#include <stdio.h>
#include <string.h>

#define MAXLEN 20

/********************************************************************************/

char *input(char *prompt,char *string,int max)
     {
     int i;
     char temp[max+1];

     printf("%s [%s]\n",prompt,string);
     for (i=0;(temp[i]=getchar())>=' ' && i<max;++i);
     temp[i]='\0';
     if (temp[0]) strcpy(string,temp);

     return string;
     }

/********************************************************************************/

int main(void)
    {
    char text[MAXLEN+1]="Default Value";

    printf("You entered the following: %s\n",input("enter folder name:",text,MAXLEN));

    return 0;
    }

/********************************************************************************/
Vyzkoušej si to a posuď sám, jestli je to použitelné. Podle mě ze strany uživatele na pochopení a použití stačí základní gramotnost a IQ průměrného šimpanze. Což tedy asi vylučuje většinu dnešních šmatloňů :P

_Jenda

  • *****
  • 1 592
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
...asi nakonec souhlasím. Našel jsem zmínku, že ungetc() třeba v GLibc vezme jenom jeden znak.

Hlavně ungetc je funkce operující nad streamy a s terminálem nemá vůbec nic společného…