Зачем нам нужно связывать std :: cin и std :: cout?

По умолчанию стандартное устройство ввода связано со стандартным устройством вывода в виде:
std::cin.tie (&std::cout); который гарантирует, что буфер вывода был очищен перед вызовом ввода. Поэтому я пытаюсь развязать их, используя std::cin.tie(0)Но, похоже, результат не имеет разницы с привязанным.

#include<iostream>
using namespace std;

int main(int argc, char *argv[])
{
char c;

cin.tie(0)

cout << "Please enter c:";
cin >> c;
cout << c ;

return 0;
}

Я неправильно тестирую? Почему мы должны связать их вместе? Они используют один и тот же буфер?

15

Решение

В вашем примере нет ничего плохого (за исключением того, что вы должны добавить точку с запятой после cin.tie(0) линия), ни с тем, как работают объекты iostream.

tie() просто гарантирует сброс cout до cin выполняет ввод. Это полезно для пользователя, чтобы увидеть вопрос перед тем, как его попросят ответить.

Однако, если выtie() cin от cout, нет никакой гарантии, что буфер cout покраснел Но нет никакой гарантии, что буфер также не очищен. Фактически, если у компьютера достаточно ресурсов, он сбрасывает cout буфер немедленно, так что это происходит раньше cin просить ввода. Это случай в вашем примере.

Итак, все работает хорошо. За исключением того, что после cin.tie(0), нет никакой гарантии, что промывка произойдет. Однако в 99% случаев такая промывка все равно будет происходить (но это больше не гарантируется).

В теории, если связаны, cin а также cout может использовать один и тот же буфер. Но я думаю, что ни одна реализация не делает это. Одна из причин заключается в том, что оба могут быть un-tie () d.

16

Другие решения

Я думаю, предыдущий ответ неверен (и мне интересно, почему он так проголосовал и помечен как истинный, хотя, очевидно, нет).

Чтобы прервать связь до того, как произойдет соединение, вы должны (только в случае стандартного ввода-вывода) (1) удалить синхронизацию со stdio а также (2) развязать потоки.

Как это:

std::cin.tie (nullptr);
std::cout.sync_with_stdio(false);
std::cout << "Please enter c: ";
std::cin >> c;

Тогда ты гарантированный иметь несвязанные потоки. Синхронизация со stdio — это особая возможность для правильного ввода — вывода после ввода для C-style и C ++ — стиля ввода и вывода, и я настоятельно рекомендую вам удалить его без реальной необходимости.

3

В C запрос пользователя для ввода следовал шаблону, в котором вы вводили команду для печати сообщения с подсказкой, а затем команду для ввода значения.

Для правильной работы этого процесса необходимо убедиться, что сообщение с подсказкой действительно отображается. Среды были настроены так, чтобы это было автоматически:

  • В среде DOS (или командной строки Windows), STDOUT небуферизован, поэтому команда печати отображает сообщение немедленно.
  • В среде * NIX STDOUT линия буферизована Таким образом, если вы следовали стилю * NIX, включив в свою строку приглашения символ новой строки, чтобы пользователь вводил данные на следующей строке, ваша подсказка будет автоматически отображаться перед вводом.

Функция связывания делает такое поведение автоматической очистки частью способа работы библиотеки iostream, а не продуктом соглашения. (хотя имейте в виду, что автоматическая очистка происходит только тогда, когда программа просит систему получить больше входных данных, поэтому существуют крайние случаи, когда cin >> c не будет на самом деле смыть)


Тем не мение! По умолчанию библиотека iostream синхронизированный с библиотекой stdio. На практике это означает, что iostream вообще не выполняет никакой буферизации; он просто пересылает данные в базовую библиотеку C.

Итак, это означает, что вы видите то, что вы обычно видели, если бы написали похожую программу на Си. Если вы находитесь в среде командной строки Windows, вывод не будет буферизован, и вы увидите приглашение перед вводом ввода.

Чтобы увидеть нативное поведение C ++, вам нужно отключить синхронизацию, запустив std::cout.sync_with_stdio(false); в начале вашей программы, как указано в другой ответ.

Если вы это сделаете, то cout Оператор не будет очищать выходной буфер (если только он не очень маленький). И так как вы сняли галстук, cin заявление также не смоет его. Таким образом, вы получите результат, в котором вам нужно будет ввести пользовательский ввод, прежде чем вы увидите приглашение.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector