Newsgroup: it.comp.lang.c++
Titolo: Writing text on stdin and reading line by line

I want to do this in a cross platform way and without external
library:
   1) Read the content of a text file
   2) Write the file content to the standard input
   3) Read line by line from the standard input
My solution:
//  1)
string scottSettings = "";
ostringstream os;
ifstream file( "scott.ini" );
while ( file )
{
	os << (char) file.get();
}
file.close();
scottSettings = os.str();
// 2)
for(int i=0; i<scottSettings.length(); ++i)
{
     cin.putback( scottSettings[i] );
}
// 3)
for( ... )
{
   string line;
   getline(cin, line);
   ...
}
This cause an infinite loop and it don't work....why ? how can solve
this problem ?

[cut]
It is a "it." newsgroup.

Scusate, anche se con un escamotage ho "risolto" il mio problema,
ripropongo la discussione in italiano !!!
Vorrei fare in modo cross platform e senza utilizzare librerie esterne
le seguenti cose :
   1) Leggere il contenuto di un file di testo
   2) Scrivere il contenuto del file nello standard input
   3) Leggere linea per linea dallo standard input
La mia soluzione
//  1)
string scottSettings = "";
ostringstream os;
ifstream file( "scott.ini" );
while ( file )
{
        os << (char) file.get();
}
file.close();
scottSettings = os.str();
// 2)
for(int i=0; i<scottSettings.length(); ++i)
{
     cin.putback( scottSettings[i] );
}
// 3)
for( ... )
{
   string line;
   getline(cin, line);
   ...
}
Questo causa un ciclo infinito e non funziona....perchè ?
Come posso risolvere questo problema ?

 Questo causa un ciclo infinito e non funziona....perch� ?
Bisognerebbe sapere qual'e' la condizione di terminazione del ciclo, che 
hai omesso.
Comunque, sei sicuro che sia un ciclo infinito e non semplicemente 
un'attesa di input dal terminale?
-- 
Carlo Milanesi
http://digilander.libero.it/carlmila

Ciao,
grazie per la risposta, effettivamente sono stato parecchio impreciso
io.
Comunque, mi interessava capire meglio il funzionamento della funzione
putback()
e il fatto che sullo standard input giustamente non ci si può
scrivere.
Se volessi scrivere un programma che lancia un processo, e volessi
riusce
a controllare lo standard input e output di quel processo che ho
lanciato come posso
fare ? immagino che sia una cosa proprietaria giusto ?

 fare ? immagino che sia una cosa proprietaria giusto ?
Proprietaria? Non so bene cosa intendi con questa parola; se intendi
che si tratta di funzioni distribuite senza codice sorgente e/o a
pagamento, allora no.
E' sufficiente usare dup2() separatamente su stdin e stdout, e poi
fare la chiamata ad execve().
Se ti serve monitorare il processo in via separata, devi anche fare
una fork() prima dell'execve(), e magari usare pipe() (se ti serve sia
per stdin che per stdout ti ci vogliono due pipe).
In pratica (non l'ho nemmeno compilato), qualcosa come:
#include <unistd.h>
int outgoing[2], incoming[2];
if (fork == 0)
{
  dup2 (STDIN_FILENO, outgoing[0]);
  dup2 (STDOUT_FILENO, incoming[1]);
  execve ('comando', .......);
}
else
{
  int incomingfd = incoming[0];
  int outgoingfd = outgoing[1];
  tua_funzione_per_manipolare_dati (incomingfd, outgoingfd);
}
Leggi le pagine di manuale delle chiamate, sono anni che non li uso.
Se hai dubbi però stiamo andando OT rispetto al C++, quindi magari
chiedi su it.comp.linux.development.
Ciao,
Matteo

Che furbo, manca la creazione della pipe.
int outgoing[2], incoming[2];
pipe (outgoing);
pipe (incoming);
Ricordati di fare il check dei valori di ritorno per vedere se ci sono
errori.
Ciao di nuovo,
Matteo

 fare ? immagino che sia una cosa proprietaria giusto ?
Non capisco che cosa intendi con "proprietaria".
Comunque quello che vuoi fare non si puo' fare usando solo il linguaggio 
e la libreria standard.
Si puo' pero' fare usando le pipe anonime, supportate da varie famiglie 
di sistemi operativi come Windows e POSIX (Unix, Linux, MAC OS X, 
Cygwin). Tuttavia, le funzioni per gestire le pipe di Windows sono 
diverse da quelle usate da POSIX.


Si con "proprietaria" intendevo dipendente dal sistema operativo, come
immaginavo.
Oggi pomeriggio parto per Parigi, quindi proverò i vostri suggerimenti
al mio ritorno :)
Grazie a tutti.