Repository 32bit  Forum
Repository 64bit  Wiki

Piu' messaggi sulla stessa riga

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

Piu' messaggi sulla stessa riga

Messaggioda legionario » lun giu 30, 2008 11:22

Rieccomi con un'altra semplice domanda di bash:

vorrei stampare in output piu' messaggi sulla stessa riga in modo tale che il messaggio successivo sostituisca quello precedente. In C lo facevo con un escape di carriage return "\r" (se non ricordo male...) ma in bash non funziona. Ho fatto come segue:

Codice: Seleziona tutto
echo -e "Hello world \r"

echo -e "Hello Italy \r"


ma i due messaggi compaiono su due righe separate.

Spero di essermi spiegato bene

Grazie

Saluti
Avatar utente
legionario
Linux 2.6
Linux 2.6
 
Messaggi: 603
Iscritto il: mer dic 08, 2004 0:00
Località: Bergamo - Roma

Re: Piu' messaggi sulla stessa riga

Messaggioda targzeta » lun giu 30, 2008 11:33

Questo perchè echo di default mette un '\n' alla fine dell'output. Se invece usi l'opzione -n, allora dovrebbe funzionare:
Codice: Seleziona tutto
echo -ne "Hello world \r"

echo -e "Hello Italy \r"


Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6200
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Piu' messaggi sulla stessa riga

Messaggioda legionario » lun giu 30, 2008 11:55

Grande!! Funziona!!
Avatar utente
legionario
Linux 2.6
Linux 2.6
 
Messaggi: 603
Iscritto il: mer dic 08, 2004 0:00
Località: Bergamo - Roma

Re: Piu' messaggi sulla stessa riga

Messaggioda Dani » lun giu 30, 2008 13:30

legionario ha scritto:In C lo facevo con un escape di carriage return "\r" (se non ricordo male...)

Come ripulivi la riga se la seconda frase da stampare era piu' corta della precedente stampata ?
Ad esempio:
Codice: Seleziona tutto
printf ("unoXXX\r");
printf ("due\n");

così facendo sul terminale resta "dueXXX" e non è carina come cosa [-(
C'è un modo per eliminare i caratteri in piu' senza ogni volta calcolare la lunghezza delle stringhe, fare una sottrazione e stampare n spazi ?
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch

Re: Piu' messaggi sulla stessa riga

Messaggioda legionario » lun giu 30, 2008 14:44

Per l'esigenza dello script bash ho risolto. Comunque mi rimane la curiosita' del metodo che mi hai suggerito. Come si fa all'atto pratico?
Avatar utente
legionario
Linux 2.6
Linux 2.6
 
Messaggi: 603
Iscritto il: mer dic 08, 2004 0:00
Località: Bergamo - Roma

Re: Piu' messaggi sulla stessa riga

Messaggioda Mario Vanoni » lun giu 30, 2008 14:48

Dani ha scritto:
legionario ha scritto:In C lo facevo con un escape di carriage return "\r" (se non ricordo male...)

Come ripulivi la riga se la seconda frase da stampare era piu' corta della precedente stampata ?
Ad esempio:
Codice: Seleziona tutto
printf ("unoXXX\r");
printf ("due\n");

così facendo sul terminale resta "dueXXX" e non è carina come cosa [-(
C'è un modo per eliminare i caratteri in piu' senza ogni volta calcolare la lunghezza delle stringhe, fare una sottrazione e stampare n spazi ?


printf("due%10s\n", ""); /* se non bastano 10, mettine di piu` */

ATTENZIONE a printf(1) con sh-scripts

/bin/printf non e` identico al bash built-in printf
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: Piu' messaggi sulla stessa riga

Messaggioda Dani » lun giu 30, 2008 15:46

legionario ha scritto:Per l'esigenza dello script bash ho risolto. Comunque mi rimane la curiosita' del metodo che mi hai suggerito. Come si fa all'atto pratico?

La mia era una domanda :) In pratica ho il tuo stesso problema, solo che in un programma C. Per sostituire una frase sempre sulla stessa riga la faccio precedere da un "\r", ma se la stringa precedentemente stampata è piu' lunga di quella da stampare restano i vecchi caratteri sul terminale.
Ho risolto, se così si puo' dire, stampando un numero di spazi che corrispondono alla lunghezza della penultima stringa meno la lunghezza dell'ultima.
Questa soluzione è noiosa e poco elegante, mi chiedevo se ci fosse qualche alternativa migliore :-k

Mario Vanoni ha scritto:printf("due%10s\n", ""); /* se non bastano 10, mettine di piu` */

Il problema è proprio quel "se non bastano" ! Durante l'esecuzione del programma l'accertarsi di questo rappresenta solo una noia in piu'.
Inoltre su terminali piccoli stampando troppi spazi si rischia di andare a capo, con conseguente "annullamento" del '\r'. In pratica la seconda stringa verrebbe stampata sulla nuova riga !
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch

Re: Piu' messaggi sulla stessa riga

Messaggioda legionario » lun giu 30, 2008 17:50

Ma che differenza c'e' tra printf ed echo?

E tra printf in C e printf in bash?
Avatar utente
legionario
Linux 2.6
Linux 2.6
 
Messaggi: 603
Iscritto il: mer dic 08, 2004 0:00
Località: Bergamo - Roma

Re: Piu' messaggi sulla stessa riga

Messaggioda Mario Vanoni » lun giu 30, 2008 19:14

legionario ha scritto:Ma che differenza c'e' tra printf ed echo?

E tra printf in C e printf in bash?


Scusa tanto, ma

man 1 printf
man 3 printf
man bash

sei proprio pigro!
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: Piu' messaggi sulla stessa riga

Messaggioda targzeta » lun giu 30, 2008 19:18

Mario Vanoni ha scritto:...
Scusa tanto, ma

man 1 printf
man 3 printf
man bash

sei proprio pigro!

Io non osavo dirlo, ma stavo pensando la stessa cosa...continuando così non si finisce più :)

Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6200
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Piu' messaggi sulla stessa riga

Messaggioda Mario Vanoni » lun giu 30, 2008 19:24

spina ha scritto:
Mario Vanoni ha scritto:...
Scusa tanto, ma

man 1 printf
man 3 printf
man bash

sei proprio pigro!

Io non osavo dirlo, ma stavo pensando la stessa cosa...continuando così non si finisce più :)

Spina


Dimenticavo

man echo

/bin/echo non e` identico al built-in della bash
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: Piu' messaggi sulla stessa riga

Messaggioda Mario Vanoni » lun giu 30, 2008 20:20

Dani ha scritto:La mia era una domanda :) In pratica ho il tuo stesso problema, solo che in un programma C. Per sostituire una frase sempre sulla stessa riga la faccio precedere da un "\r", ma se la stringa precedentemente stampata è piu' lunga di quella da stampare restano i vecchi caratteri sul terminale.
Ho risolto, se così si puo' dire, stampando un numero di spazi che corrispondono alla lunghezza della penultima stringa meno la lunghezza dell'ultima.
Questa soluzione è noiosa e poco elegante, mi chiedevo se ci fosse qualche alternativa migliore :-k

Mario Vanoni ha scritto:printf("due%10s\n", ""); /* se non bastano 10, mettine di piu` */

Il problema è proprio quel "se non bastano" ! Durante l'esecuzione del programma l'accertarsi di questo rappresenta solo una noia in piu'.
Inoltre su terminali piccoli stampando troppi spazi si rischia di andare a capo, con conseguente "annullamento" del '\r'. In pratica la seconda stringa verrebbe stampata sulla nuova riga !


Se vuoi la soluzione ottimale per tutti gli schermi
e` fattibile, pero` vedi i problemi alla fine.

zzz.c

gcc -o zzz zzz.c

Questo funziona perfettamente se, qui il problema, fai prima
export COLUMNS
zzz

RATIONALE:
COLUMNS non viene esportato perche' il suo valore dipende
dalla grandezza dello schermo (X) che puo` variare.
set | less ti fa vedere COLUMNS,
env | less invece no.
Per farlo perfetto devi usare ioctls(2), qui pero` ignoro,
pare che SIGWINCH cambi se la dimensione del terminale cambia.

Altra sorgente di informazione forse e2fsck,
con computer diversi, 128 e 160 colonne,
la percentuale e` sempre verso fondo riga.

EDIT:
Pensando ai terminale vt200 di anni fa,
cols - str - 2
quelli non sopportavano un \n alla colonna 79/80.

EDIT2:
Il cast (int) strlen
perche' strlen ritorna size_t
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite