Я написал простой интерпретатор типа FORTH, в котором я вводил строку за раз и обрабатываю ее следующим образом:
std::string line;
while (!std::cin.eof()) {
std::getline(std::cin, line);
std::istringstream input(line);
std::copy(std::istream_iterator<std::string>(input),
std::istream_iterator<std::string>(),
std::back_inserter(data.input_));
// some work
}
И если я введу 5 5 + . <enter>
, это будет выглядеть так:
5 5 + .
10 ok
Но я бы хотел показать:
5 5 + . 10 ok
Другими словами, новая строка должна означать конец строки ввода, но не должна отражаться на std :: cout.
Прочитав, кажется, я не смогу добиться этого в std c ++ (это правда?), Но я могу использовать функции в библиотеке termios, чтобы настроить консоль таким образом в системе POSIX, не вмешиваясь в другие функции консоли такие как обработка ctl-c и т. д. Я не понял, как именно. Кто-нибудь может указать мне путь?
while (!stream.eof())
) считается неправильным? На самом деле, это может быть основной причиной вашей проблемы. Попробуйте вместо этого сделатьwhile (std::getline(std::cin, line))
. - person Some programmer dude   schedule 05.10.20205 5 + .
, который он отображает, - это ввод, а не то, что выводит ваша программа? Одна из причин, по которой использование минимально воспроизводимого примера так важно, заключается в том, что нам также не нужно гадать поскольку вход и выход помечены отдельно. - person Some programmer dude   schedule 05.10.2020c_lflag
termios? В качестве альтернативы отключите все эхо с помощью termios и считывайте символы вместо строк, и тогда ваша программа сможет получить полный контроль над тем, что отображается для всего вводимого ввода, например оцените ввод после ввода=
вместо.
и\n
. См. stackoverflow.com/questions/58205140/. - person sawdust   schedule 06.10.2020