Tout d'abord, vous devez générer des retours à la ligne lors de l'impression vers std::cout
, sinon std::getline()
n'aura pas de ligne complète à lire.
Version améliorée :
#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;
}
Maintenant, essayez ceci :
./bin >file <file
vous ne voyez aucune sortie, car elle va dans le fichier. Mais si vous arrêtez le programme et regardez le fichier, voyez, il est plein de
stars
stars
stars
stars
:-)
En outre, la raison pour laquelle la boucle de rétroaction ne peut pas démarrer lorsque vous essayez
./bin 0>&1
c'est-à-dire que vous vous retrouvez avec stdin et stdout connectés à /dev/tty
(ce qui signifie que vous pouvez voir la sortie).
Mais un périphérique TTY ne peut jamais fermer la boucle, car il se compose en fait de deux canaux séparés, l'un transmettant la sortie au terminal, l'autre transmettant l'entrée du terminal au processus.
Si vous utilisez un fichier normal pour l'entrée et la sortie, la boucle peut être fermée. Chaque octet écrit dans le fichier sera également lu à partir de celui-ci, si le stdin du processus y est connecté. Tant qu'aucun autre processus ne lit simultanément le fichier, car chaque octet d'un flux ne peut être lu qu'une seule fois.