Инъекция строки в 'cin'

У меня есть функция, которая читает пользовательский ввод из std :: cin, и я хочу написать unittest, который вставляет некоторые строки в std :: cin, так что последующее извлечение из std :: cin будет читать эту строку вместо паузы для ввода с клавиатуры ,

В идеале я бы изменил сигнатуру функции так, чтобы я мог передавать собственный поток istream в качестве параметров, но я не могу сделать это здесь, поскольку у меня есть фиксированный интерфейс, который я не могу изменить.

cin.putback () являетсяпочти то, что я хотел, однако, это вставка только одного символа за раз, и это вставка их в обратном порядке (но я где-то читал, что возвращение символа, которого изначально там не было, может быть опасным, хотя сайт не уточняет, почему ). Я пробовал несколько методов для вставки строки во внутренний буфер cin cin.rdbuf (), но ни один из них не сработал. Я также рассмотрел использование сценария внешнего тестирования или создания подпроцесса, однако сначала я хотел бы рассмотреть тест на чистом C ++.

Итак, есть ли способ поместить строки в CIN? Или вы знаете лучший способ ввести мой «фальшивый ввод с клавиатуры»?

Ответы на вопрос(3)

Решение Вопроса

: cin, попробуйте это:

int main() {
  using namespace std;
  streambuf *backup;
  istringstream oss("testdata");
  backup = cin.rdbuf();
  cin.rdbuf(oss.rdbuf());
  string str;
  cin >> str;
  cout << "read " << str;    
}

Вы можете восстановить потоковую буферизацию std :: cin после завершения резервного копирования. Я не гарантирую переносимость этого; P

 Lie Ryan26 сент. 2010 г., 13:42
+1 именно то, о чем я просил (лично я все еще задаюсь вопросом, хорошая ли идея сделать что-то подобное, даже для кода тестирования whitebox).
 Potatoswatter26 сент. 2010 г., 12:38
+1. или жеstringbuf sb("testdata"); streambuf *backup = cin.rdbuf(&sb);, Это соответствует и достаточно портативно, но не хорошая практика. Ах да, и ему, возможно, придется сделатьcin.clear() чтобы выйти из условия EOF, как только закончится вход: vP.

cin, вы можете иметь вашу программу принять общийstd::istream&, Когда работает нормально, просто передайте егоcin, Во время модульного теста передайте ему поток ввода-вывода вашего собственного создания.

 Gillespie11 янв. 2017 г., 23:43
Это решение действительно великолепно. Вы можете перейти в открытый файл черезifstream если вы хотите передать файл в качестве тестового ввода, или вы можете просто передатьistringstream если вы хотите просто передать строку в качестве тестового ввода.

олом, поэтому вы не можете вернуть целую строку. Используйте поток, который оборачивает cin и разрешает произвольную длину последовательности putback (). Я думаю, что Boost.Iostream имеет что-то похожее, и если это не так, может быть полезно реализовать такую ​​оболочку.

Ваш ответ на вопрос