Как подавить отображение \ n после ввода в с ++?

Я написал простой интерпретатор типа 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 и т. д. Я не понял, как именно. Кто-нибудь может указать мне путь?


person Jaldhar    schedule 05.10.2020    source источник
comment
Где код, который печатает этот вывод?   -  person smac89    schedule 05.10.2020
comment
Прочтите Почему iostream :: eof внутри условия цикла (т. е. while (!stream.eof())) считается неправильным? На самом деле, это может быть основной причиной вашей проблемы. Попробуйте вместо этого сделать while (std::getline(std::cin, line)).   -  person Some programmer dude    schedule 05.10.2020
comment
Также найдите время, чтобы обновить страницы справки, возьмите SO тур, прочтите Как задать вопрос, а также этот контрольный список вопросов. И не забывайте, как редактировать свои вопросы или как создать минимальный воспроизводимый пример.   -  person Some programmer dude    schedule 05.10.2020
comment
Я не думал, что вывод будет актуальным, потому что проблема заключается в вводе, нет? Но в любом случае это будет что-то вроде: std :: cout ‹---------------- 10 ‹› ''; std :: cout ‹< ОК \ n;   -  person Jaldhar    schedule 05.10.2020
comment
Кстати, в библиотеке ‹conio.h› для windows есть get_ch (). то, что он делает, получает char (например, ввод), но не выводит на консоль. если вы нашли аналогичную функцию, которая работает на вашем OS-терминале. ты можешь использовать это   -  person Ahmet Yusuf Yatkın    schedule 05.10.2020
comment
Кажется, некоторые из нас неправильно поняли, что вы пытаетесь сделать. 5 5 + ., который он отображает, - это ввод, а не то, что выводит ваша программа? Одна из причин, по которой использование минимально воспроизводимого примера так важно, заключается в том, что нам также не нужно гадать поскольку вход и выход помечены отдельно.   -  person Some programmer dude    schedule 05.10.2020
comment
Учитывая, что вы работаете на платформе POSIX, существует множество способов обработки ввода с терминала, не вызывая, например, перевод строки для эха. Библиотека ncurses - одно из таких решений, но вы также можете отправлять управляющие коды терминала (не управляющие коды VT100), чтобы включать и выключать эхо по желанию.   -  person Some programmer dude    schedule 05.10.2020
comment
Предполагая, что отображаемый ввод вызван эхом termios (а не вашей программой, выполняющей эхо), пробовали ли вы очистить атрибут ECHONL в члене c_lflag termios? В качестве альтернативы отключите все эхо с помощью termios и считывайте символы вместо строк, и тогда ваша программа сможет получить полный контроль над тем, что отображается для всего вводимого ввода, например оцените ввод после ввода = вместо . и \n. См. stackoverflow.com/questions/58205140/.   -  person sawdust    schedule 06.10.2020
comment
@sawdust, к сожалению, это не имеет значения. Пока работали только escape-последовательности ANSI, предложенные Ахметом Юсуфом Яткиным.   -  person Jaldhar    schedule 06.10.2020
comment
Ваши результаты верны. Оказывается, ECHONL предназначен только для включения (а не подавления) эха новой строки. Однако альтернатива все еще жизнеспособна: отключить все эхо с помощью termios (что он может сделать), а затем заставить вашу программу отображать то, что она хочет. Это общее решение POSIX, которое не зависит от какой-либо конкретной эмуляции терминала.   -  person sawdust    schedule 06.10.2020


Ответы (1)


Вы можете использовать escape-последовательности VT100 для настройки вывода консоли (VT100 ESC SEQUENCES ). в этом случае;

используйте \033[1A для перехода на 1 строку вверх, \033[nC (n - значение int) для перехода на букву вправо

person Ahmet Yusuf Yatkın    schedule 05.10.2020
comment
Это косметический обходной путь, а не фактическое исправление. - person Some programmer dude; 05.10.2020
comment
@super ты прав. Но мы не знаем, какой терминал он использует. и, может быть, будет полезен ему или другим будущим людям - person Ahmet Yusuf Yatkın; 05.10.2020
comment
В конце концов, я хотел бы быть независимым от терминала, но сейчас я разрабатываю и тестирую Linux и ориентируюсь на любую POSIX-подобную ОС. - person Jaldhar; 05.10.2020
comment
@ AhmetYusufYatkın Хотя это может быть не идеально, но определенно работает! Я понимаю, как это может вызвать проблемы с переносимостью в долгосрочной перспективе, поэтому я все еще жду правильного ответа. - person Jaldhar; 05.10.2020
comment
@Jaldhar в моих поисках (я тоже кодировал консольное приложение) Невозможно действительно удалить Console Outputs, если вы не достигли консольного API. Вы можете делать только косметические решения, такие как это или \ b, или другие вещи. без консольного API. так что ваш правильный ответ, возможно, не придет. - person Ahmet Yusuf Yatkın; 05.10.2020