2015-08-10 2 views
2

Упражнение о стандартной гипергликемии спрашивает меня:Перенаправление станд :: CIN непосредственно StD :: COUT

Читать ввод из стандартного ввода и записывает его на стандартный вывод.

Возможное решение:

#include<iostream> 
#include<string> 

using std::cin; using std::cout; 
using std::string; 

int main() 
{ 
    string word; 
    while (cin >> word) 
     cout << word; 

    return 0; 
} 

Строка действует как буфер в этом примере. Если вы попытаетесь избавиться от буфера, сделав что-то вроде этого:

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

int main() 
{ 
    while (cout << cin) 
     ; 
    return 0; 
} 

Результаты очень разные. Когда я запускаю этот код я получаю бесконечный поток

0x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d30

на терминале.

Почему это происходит? Почему эти программы ведут себя по-другому?

+1

Как вы получили 'cout << cin' для компиляции? – emlai

+1

Я не вижу этого [компиляции] (http://ideone.com/3ZzFWd) – scohe001

+0

@ scohe001 https: // ideone.com/zRMP7G компилируется отлично – Andrey

ответ

5

cout << cin не будет работа так, как вы этого хотите. В C++ 11 и более поздних версиях он даже не компилируется.

Вы видите неудачный побочный эффект (теперь устаревший) "safe bool" idiom.

Перед C++, на фиг.11, std::istreamcould be implicitly converted to a void* to emulate bool semantics. (Так как C++, 11, explicit operator bool() const заполняет эту роль)

Таким образом, код:

while (cout << cin) 

компилируется в C++, 98 или С + +03, так как он может быть неявно преобразован в:

while (cout << static_cast<void*>(cin)) 

Этот бросок разрешается производить любые не-NULL void* Whe n cin не находится в состоянии «ошибка». В вашем случае он создает указатель 0x600d30.

1

В первом решении вы извлекаете строку из cin и повторно вводите ее в cout. Но во втором случае компилятор пытается преобразовать cin в значение, подходящее для инъекции в cout.

Ваша реализация преобразована cin в указатель и неоднократно печатала его. Шахта просто превратила cin в bool и отменила печать 1.

Но будьте осторожны, даже ваша первая версия не прозрачна для нескольких пространств или вкладок и, вероятно, также не будет уважать линии. Я бы предпочел:

#include<iostream> 
#include <string> 


int main() 
{ 
    std::string line; 

    while (std::getline(std::cin, line)) { 
     std::cout << line << std::endl; 
    } 
    return 0; 
} 
Смежные вопросы