Предположим, у меня есть программа, которая принимает ввод с клавиатуры или альтернативно принимает перенаправленный ввод из файла, такой что:
#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
переключиться с принятия ввода файла вместо принятия ввода с клавиатуры во время работы файла? Если нет, не могли бы вы объяснить, почему?
Что вы можете. std::cin.rdbuf()
функция может переназначить другой буфер ввода / вывода cin
, Но вы должны сначала получить буфер.
Когда вы используете оболочку для перенаправления файла в stdin
, файл заменяет клавиатуру. В противном случае оболочка отвечает за подключение клавиатуры к программе, так что теперь вы остались одни. C ++ не определяет интерфейс клавиатуры. Если вы не хотите использовать платформу для конкретной платформы (вероятно, не стоит), соглашение об использовании программы должно немного измениться.
Наиболее стандартным решением является добавление входного файла в качестве параметра командной строки. Это можно легко открыть как std::filebuf
буферный объект. Передайте это std::cin.rdbuf()
и сохраните возвращаемое значение. Сейчас std::cin
читает из файла. Когда закончите, передайте сохраненное значение rdbuf
восстановить его в оригинале stdin
дескриптор файла, который все еще подключен к клавиатуре.
Проблема не с std::cin
, С помощью std::cin.rdbuf(newBuf)
Вы можете переключать источники входного сигнала. Тем не менее, каков ваш новый источник ввода? ISO C ++ не имеет представления о клавиатурах. Он знает о стандартном вводе, но здесь уже указано содержимое файла.
Вы можете обернуть интерфейс клавиатуры уровня ОС в std::streambuf
интерфейс, но это, конечно, не портативный.