Как форсировать ввод с терминала, даже если ввод исполняемого файла перенаправлен из файла? - PullRequest
0 голосов
/ 10 июня 2019

Я хочу отладить код с огромным вводом, который перенаправляется из файла, используя

./a.out < input.in

но в какой-то момент я хочу прочитать строку ввода с клавиатуры в программе. Как и следующая программа не должна запускаться после input () до тех пор, пока ввод не будет считан с клавиатуры, а cin должен вводить из файла.

#include <bits/stdc++.h>
using namespace std;
int main(){
   int a;
   cin>>a;
   input();
}

1 Ответ

0 голосов
/ 10 июня 2019

Есть решение, если вы работаете в 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
...