2013-11-29 1 views
3

Я заметил, что во многих файлах исходного кода можно увидеть, что письмо к cout непосредственно перед чтением из cinбез явного флеша:Явный флеш, необходимый для чередующихся операций cout и cin?

#include <iostream> 
using std::cin; using std::cout; 

int main() { 
    int a, b; 
    cout << "Please enter a number: "; 
    cin >> a; 
    cout << "Another nomber: "; 
    cin >> b; 
} 

Когда это выполняется, и пользователь вводит 42[Enter]73[Enter] он хорошо печатает (г ++ 4.6 , Ubuntu):

Please enter a number: 42 
Another number: 73 

это определяется поведение, то есть делает стандарт сказать, что каким-то образом cout промывается перед тем cin читается? Могу ли я ожидать такого поведения на всех соответствующих системах?

Или следует разместить cout << flush после этих сообщений?

ответ

7

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

Фактическая логика для сброса потока происходит при построении std::istream::sentry с входным потоком: когда поток ввода не находится в состоянии сбоя, поток, на который указывает stream.tie(), сбрасывается. Конечно, это предполагает, что входные операторы выглядят примерно так:

std::istream& operator>> (std::istream& in, T& value) { 
    std::istream::sentry cerberos(in); 
    if (sentry) { 
     // read the value 
    } 
    return in; 
} 

Стандартные операции потока реализованы таким образом. Когда пользовательские операции ввода не реализованы в этом стиле и вводят их напрямую с помощью буфера потока, флеш не будет выполняться. Ошибка, конечно, во входных операциях.

+0

спасибо за дополнительную информацию о часах. – towi