Подтвердить что ты не робот

Зачем нам связывать 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;
}

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Вот так:

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

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