2012-12-27 17 views
12

Domyślnie standardowe urządzenie wejściowe jest powiązane ze standardowym urządzeniem wyjściowym w postaci: std::cin.tie (&std::cout);, co gwarantuje, że bufor wyjściowy został przepłukany przed wywołaniem wejścia. Próbuję więc je rozwiązać, używając std::cin.tie(0), ale wygląda na to, że wynik nie ma różnicy z powiązanym.Dlaczego musimy wiązać std :: cin i std :: cout?

#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; 
} 

Czy testuję źle? Dlaczego musimy powiązać je ze sobą? Czy mają ten sam bufor?

+0

Ideą remisu jest wyświetlenie monitu przed odczytaniem danych wejściowych. :-) –

Odpowiedz

16

W twoim przykładzie nie ma nic złego (z wyjątkiem dodawania średnika po linii cin.tie(0)) ani sposobu działania obiektów iostream.

tie() po prostu gwarantuje spłukiwanie cout przed cin wykonuje dane wejściowe. Jest to przydatne dla użytkownika, aby zobaczyć pytanie, zanim zostanie poproszony o odpowiedź.

Jednakże, jeśli nie- tie()cin z cout, nie ma gwarancji, że bufor z cout jest opróżniany. Ale nie ma gwarancji, że bufor również nie jest przepłukiwany. W rzeczywistości, jeśli komputer ma wystarczającą ilość zasobów, natychmiast przepłukuje bufor cout, więc występuje przed wprowadzeniem danych. Tak jest w twoim przykładzie.

Wszystko działa dobrze. Poza tym, po cin.tie(0), nie ma gwarancji, że wystąpi płukanie. Jednakże, w 99% przypadków, płukanie będzie nadal występować (ale nie jest już gwarantowane).

Teoretycznie, jeśli są powiązane, cin i cout mogą współużytkować ten sam bufor. Ale myślę, że żadna implementacja tego nie robi. Jednym z powodów jest to, że dwa mogą być związywane() d.

0

Myślę, że poprzednia odpowiedź jest błędna (i zastanawiam się, dlaczego jest tak upvoted i oznaczone jako prawdziwe, oczywiście nie jest).

Aby przerwać dzieje się przed połączeniem, należy (w przypadku standardowego ustawienia tylko) (1) usunąć synchronizację ze stdio i (2) odłączyć strumienie.

Jak to:

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

Wtedy jesteś gwarantowana mieć odwiązał strumienie. Synchronizacja ze stdio jest specjalną zdolnością do prawidłowego funkcjonowania po zamówieniu dla wejścia C i stylu C++ i zdecydowanie odradzam ci usuwanie go bez rzeczywistej konieczności.

Powiązane problemy