Как исправить ввод из readline от перехода к выходному потоку - PullRequest
0 голосов
/ 10 мая 2019

Я делаю проект на C ++, и мне было поручено заменить std :: getline на более функциональную функцию readline () из библиотеки readline.h, так как она содержит больше функционалов и будет более полезной в целом.Однако программа, которую я выполняю, выполняет несколько тестов с другими файлами "in-X", генерирует файлы "out-X" и проверяет вывод с результатом для тестирования.

Тестирование проходит в основном так:

./a.exe < in-X.txt > out-X.txt

Проблема, с которой я столкнулся, заключается в том, что функция readline (), похоже, выводит в выходной файл строку, которую она прочитала из ввода, поэтому в основном все мои сгенерированные файлы "out-X" содержат весь ввод плюс ожидаемый результати это очень хлопотно.

Я уже пробовал много комбинаций rl_redisplay () и использование rl_delete_text () без решения.Я также попытался использовать функции управления терминалами, такие как rl_prep_terminal (1) в необработанном режиме и rl_deprep_terminal (), но ничего не работает.Я также не смог попробовать rl_tty_set_echoing (), потому что моя программа, похоже, не может найти его в библиотеке.

Я попытался максимально минимизировать проблему и придумал это упрощенноеcode

/* Standard include files. stdio.h is required. */
#include <string.h>
#include <iostream>
#include <stdlib.h>

/* Standard readline include files. */
#include <readline/readline.h>
#include <readline/history.h>

int main(int argc, char* argv[]) {
  char *buf;
  while ((buf = readline("Prompt>")) != nullptr) {
    std::string line(buf);
    if (buf)
      add_history(buf);


    std::cout << "Line : " << line << "\n";
  }

  return 0;
}

Что очень просто, печать приглашения readline () не является проблемой, как это ожидается на выходе, но печать прочитанного «buf»:

В основном с файлом в

a = 2
b = 3
1 + 2 + 3

Я ожидал бы вывод

Line : a = 2
Line : b = 3
Line : 1 + 2 + 3

Но я получаю

Prompt> a = 2
Line : a = 2
Prompt> b = 3
Line : b = 3
Prompt> 1 + 2 + 3
Line : 1 + 2 + 3
Prompt> 

Последний "Prompt>", который содержитEOF - это то, с чем я могу работать или жить, но печатать 1-ю, 3-ю и 5-ю строки я не могу.

...