Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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.
string name ;
cout << "Zadejte vaše jméno:";
getline(cin, name ) ;
cout << "Hello " << name << endl ;
Díky
-
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.
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
-
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á
-
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..
https://stackoverflow.com/questions/2496857/is-there-a-function-in-c-that-does-the-same-as-raw-input-in-python
-
...
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.
-
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 (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
-
...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.
-
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
-
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++:
#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
-
...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…