Zuerst müssen Sie beim Drucken nach std::cout
Zeilenumbrüche ausgeben , sonst std::getline()
keine vollständige Zeile zum Lesen haben.
Verbesserte Version:
#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;
}
Versuchen Sie jetzt Folgendes:
./bin >file <file
Sie sehen keine Ausgabe, weil es in die Datei geht. Aber wenn Sie das Programm stoppen und sich die Datei ansehen, sehen Sie, sie ist voll von
stars
stars
stars
stars
:-)
Auch der Grund, warum die Rückkopplungsschleife nicht starten kann, wenn Sie es versuchen
./bin 0>&1
ist, dass sowohl stdin als auch stdout mit /dev/tty
verbunden sind (was bedeutet, dass Sie die Ausgabe sehen können).
Aber ein TTY-Gerät kann die Schleife niemals schließen, da es tatsächlich aus zwei getrennten Kanälen besteht, von denen einer die Ausgabe an das Terminal und der andere die Terminaleingabe an den Prozess weiterleitet.
Wenn Sie eine reguläre Datei für die Ein- und Ausgabe verwenden, kann die Schleife geschlossen werden. Jedes in die Datei geschriebene Byte wird auch daraus gelesen, wenn die stdin des Prozesses damit verbunden ist. Solange kein anderer Prozess gleichzeitig aus der Datei liest, da jedes Byte in einem Stream nur einmal gelesen werden kann.