Newsgroup: it.comp.lang.c++
Titolo: STRANEZZE!

Osservate questo semplice programma
#include<iostream.h>
#include<stdio.h>
main()
{
     char frase[80];
     cout<< " inserire una frase :  ";
     gets( frase );
     cout<<" ecco la frase inserita : ";
     cout<<frase;
     return 0;
}
io mi aspetterei di vedere sullo schermo la seguente cosa
inserire una frase :
poi metto la frase e dovrebbe andare cosě
inserire una frase : ciao pippo
ecco la frase inserita : ciao pippo
invece questo non accade, compare lo schermo tutto nero, digito una frase e
poi compare tutto insieme( vedi sopra)
perchč secondo voi?


Per prima cosa  credo sia buona norma non mischiare assieme l'IO del C e quello del C++.
Comunque penso che lo abbia fatto solo per curiosità, vero?
Il motivo per questo comportamento è semplice:
la libreria di I/O del C e del C++ usano un buffer interno.
Quindi quando scrivi
   cout<< " inserire una frase :  ";
i caratteri non vanno direttamente a destinazione, ma vengono scritti nel buffer.
Il buffer poi viene svuotato quando viene riempito completamente oppure
quando richiesto dall'utente.
Se al posto di gets usi cin le cose funzionano come dovrebbero.
Infatti cout e cin sono 'legate' da:
   cin.tie(&cout);
Questa istruzione fa in modo che ad ogni uso di cin, il buffer di cout viene svuotato.
Ossia:
     cout << " inserire una frase :  ";
     cin >> frase;
equivale a:
     cout << " inserire una frase :  ";
     cout.flush();
     cin >> frase;
Quindi la frase " inserire una frase :  " appare sullo schermo prima dell'input.
Se vuoi che questo avvenga anche quando usi assieme cgets e cout devi fare:
    ios_base::sync_with_stdio(true);
prima di ogni operazione di I/O.
Manlio Perillo

 perchč secondo voi?
Prova a scrivere
cout << "Inserire una frase: " << flush;
anche se non dovrebbe essere necessario dato che l'impostazione di
default č che lo standard output e lo standard input sono legati (tie())
nel senso che avviene automaticamente un flush del primo quando si legge
il secondo. Forse il tuo compilatore non č molto aggiornato...
EMG

 Per prima cosa  credo sia buona norma non mischiare assieme l'IO del C e quello del C++.
Azz! Mi era sfuggito questo particolare... :-(
EMG


Altra alternativa č fare:
  cout.setf(ios_base::unitbuf);
In questo modo cout svuota il buffer dopo ogni operazione di output.
Nota:
riguardo ad unitbuf ho un dubbio.
Non dovrebbe essere settato di default in cout?
Con il BCC 5.5 ed il DJGPP non č cosě.
Inoltre, sempre con il BCC 5.5 ed il DJGPP, č presettato a true anche sync_with_stdio.
Manlio Perillo

Non so che compilatore tu utilizzi ma io con il VC++ 6.0 e una piccola
modifica al tuo codice sorgente l'ho fatto funzionare...
Codice nuovo:
-----------------------
#include < iostream >
using namespace std;
int main(int, char* [])
{
     char frase[80];
     cout << " inserire una frase :  ";
     gets(frase);
     cout << " ecco la frase inserita : ";
     cout << frase;
     return 0;
}
Cosě funziona ed č + standardizzato...
Lawrence Oluyede
rhy...@tiscalinet.it
"Se ti credono rozzo,
  fai il raffinato;
se ti credono raffinato,
  mostrati rozzo."
Johnny Mnemonic


 anche sync_with_stdio.
Infatti il default e' true.
	Mauro

 wrote in message 39AAA77F...@iperbole.bologna.it...

Grazie per la precisazione.
Manlio Perillo