Есть решение, если вы работаете в Unix-подобной системе.Обычно вы можете открыть свой терминал как новый дескриптор файла.В моей системе имя этого файла /dev/tty
.См. https://stackoverflow.com/a/8514853/657700 для получения дополнительной информации.
Вот пример программы, которая читает со своего стандартного ввода и также просит пользователя ввести строку в интерактивном режиме:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main(int argc, char* argv[]) {
// open our terminal
std::ifstream term("/dev/tty");
// read 10 lines from input
vector<string> lines(10);
for(auto& l : lines)
getline(std::cin, l);
// read a line from tty
string tty_line;
cout << "Please enter a line:\n";
cout << "--------------------\n";
getline(term, tty_line);
cout << endl;
// output 5 lines from input
cout << "First 5 lines read from stdin:\n";
cout << "------------------------------\n";
for(int i=0; i<5; ++i)
cout << lines.at(i) << '\n';
// output the line read from tty
cout << "Line read from tty:\n";
cout << "-------------------\n";
cout << tty_line << '\n';
// output the 5 remaining lines read from input
cout << "Last 5 lines read from stdin:\n";
cout << "-----------------------------\n";
for(int i=5; i<10; ++i)
cout << lines.at(i) << '\n';
}
Здесьмоя сессия с использованием этой программы:
fjardon@redacted 12:00:28 ~/tmp
$ seq 10 | ./read-stdin-terminal.exe
Please enter a line:
--------------------
something
First 5 lines read from stdin:
------------------------------
1
2
3
4
5
Line read from tty:
-------------------
something
Last 5 lines read from stdin:
-----------------------------
6
7
8
9
10