Per prima cosa, devi generare nuove righe quando stampi su std::cout
, altrimenti std::getline()
non avrà alcuna riga completa da leggere.
Versione migliorata:
#include <iostream>
#include <string>
int main()
{
std::cout << "stars" << std::endl;
for(;;) {
std::string string_object;
std::getline(std::cin, string_object);
std::cout << string_object << std::endl;
}
return 0;
}
Ora prova questo:
./bin >file <file
non vedi alcun output, perché va al file. Ma se interrompi il programma e guardi il file, ecco, è pieno di
stars
stars
stars
stars
:-)
Inoltre, il motivo per cui il ciclo di feedback non può iniziare quando provi
./bin 0>&1
è che ti ritroverai con stdin e stdout collegati a /dev/tty
(significa che puoi vedere l'output).
Ma un dispositivo TTY non può mai chiudere il ciclo, perché in realtà consiste di due canali separati, uno che passa l'output al terminale, l'altro che passa l'input del terminale al processo.
Se usi un file normale per l'in- e l'output, il ciclo può essere chiuso. Ogni byte scritto nel file verrà letto anche da esso, se lo stdin del processo è connesso ad esso. Finché nessun altro processo legge dal file contemporaneamente, perché ogni byte in un flusso può essere letto solo una volta.