Может ли std :: cin переключаться с приема ввода файла на ввод с клавиатуры во время выполнения?

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

#include <iostream>

using namespace std;

int main() {
string str;
while (getline(cin, str)) {
if(str.compare("exit") == 0)
return 0;
}
return 0;
}

В этой реализации я ожидаю, что экземпляр программы, использующий ввод с клавиатуры, завершится после ввода «exit», а экземпляр программы, использующий ввод с файла, завершится после EOF.

Я хотел бы реализовать такую ​​функциональность, чтобы при запуске экземпляра программы, использующего ввод файла, он позволял вводить данные с клавиатуры при достижении EOF вместо завершения. Я провел некоторое исследование, которое предполагает, что это невозможно с getline как условие для цикла while, потому что он вернет false, как только закончится ввод файла, и я не знаю, как сказать cin что я хочу принять ввод с клавиатуры в то время.

Итак, возможно ли это для cin переключиться с принятия ввода файла вместо принятия ввода с клавиатуры во время работы файла? Если нет, не могли бы вы объяснить, почему?

1

Решение

Что вы можете. std::cin.rdbuf() функция может переназначить другой буфер ввода / вывода cin, Но вы должны сначала получить буфер.

Когда вы используете оболочку для перенаправления файла в stdin, файл заменяет клавиатуру. В противном случае оболочка отвечает за подключение клавиатуры к программе, так что теперь вы остались одни. C ++ не определяет интерфейс клавиатуры. Если вы не хотите использовать платформу для конкретной платформы (вероятно, не стоит), соглашение об использовании программы должно немного измениться.

Наиболее стандартным решением является добавление входного файла в качестве параметра командной строки. Это можно легко открыть как std::filebuf буферный объект. Передайте это std::cin.rdbuf()и сохраните возвращаемое значение. Сейчас std::cin читает из файла. Когда закончите, передайте сохраненное значение rdbuf восстановить его в оригинале stdin дескриптор файла, который все еще подключен к клавиатуре.

2

Другие решения

Проблема не с std::cin, С помощью std::cin.rdbuf(newBuf) Вы можете переключать источники входного сигнала. Тем не менее, каков ваш новый источник ввода? ISO C ++ не имеет представления о клавиатурах. Он знает о стандартном вводе, но здесь уже указано содержимое файла.

Вы можете обернуть интерфейс клавиатуры уровня ОС в std::streambuf интерфейс, но это, конечно, не портативный.

1

По вопросам рекламы [email protected]