Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: petr_bures 22. 02. 2020, 22:44:15

Název: Vložení editovatelného textu do konzole v C++
Přispěvatel: petr_bures 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
Název: Re:C++ Jak vložit nějaký text do konzoly který by šel editovat a následně získat
Přispěvatel: xyz 22. 02. 2020, 22:59:29
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?  :-)
Název: Re:C++ Jak vložit nějaký text do konzoly který by šel editovat a následně získat
Přispěvatel: petr_bures 22. 02. 2020, 23:11:27
Neni jednodussi vypsat "Zadejte vase jmeno (Petr):" A pokud uzivatel to odbouchne entrem, jmeno bude Petr...

Tak to nechci

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

Název: Re:C++ Jak vložit nějaký text do konzoly který by šel editovat a následně získat
Přispěvatel: František Ryšánek 22. 02. 2020, 23:36:53
šimrá mě v zátylku ungetc() .
Název: Re:C++ Jak vložit nějaký text do konzoly který by šel editovat a následně získat
Přispěvatel: petr_bures 23. 02. 2020, 00:05:08
š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
Název: Re:C++ Jak vložit nějaký text do konzoly který by šel editovat a následně získat
Přispěvatel: _Jenda 23. 02. 2020, 00:31:48
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á
Název: Re:C++ Jak vložit nějaký text do konzoly který by šel editovat a následně získat
Přispěvatel: petr_bures 23. 02. 2020, 00:46:59
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
Název: Re:C++ Jak vložit nějaký text do konzoly který by šel editovat a následně získat
Přispěvatel: petr_bures 23. 02. 2020, 01:48:33
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
Název: Re:C++ Jak vložit nějaký text do konzoly který by šel editovat a následně získat
Přispěvatel: bmn 23. 02. 2020, 05:08:23
...
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.
Název: Re:C++ Jak vložit nějaký text do konzoly který by šel editovat a následně získat
Přispěvatel: tecka 23. 02. 2020, 05:11:30
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.
Název: Re:C++ Jak vložit nějaký text do konzoly který by šel editovat a následně získat
Přispěvatel: František Ryšánek 23. 02. 2020, 07:49:38
š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 (https://invisible-island.net/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 (https://pagure.io/newt) (download (https://releases.pagure.org/newt/)) 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 (http://tvision.sourceforge.net/) ;-)

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
Název: Re:C++ Jak vložit nějaký text do konzoly který by šel editovat a následně získat
Přispěvatel: František Ryšánek 23. 02. 2020, 08:01:41
...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.
Název: Re:C++ Jak vložit nějaký text do konzoly který by šel editovat a následně získat
Přispěvatel: Ink 23. 02. 2020, 08:26:26
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
Název: Re:Vložení editovatelného textu do konzole v C++
Přispěvatel: Radovan . 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/ (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 (https://www.databazeknih.cz/knihy/dialog-s-pocitacem-239553), důkladně jí prostuduj (protože v češtině nic lepšího asi nenajdeš), a pak se řiď radou od ondrama (https://forum.root.cz/index.php?topic=22593.msg325417#msg325417) ;)

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
Název: Re:C++ Jak vložit nějaký text do konzoly který by šel editovat a následně získat
Přispěvatel: _Jenda 23. 02. 2020, 16:23:00
...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…