2017-11-04 51 views
0

coutと同様に機能するオブジェクトを作成するのに、this_thread::sleep_for()を使ってテストしていますが、文字列を印刷するときは文字間にわずかな遅延があります。しかし、各文字の間に0.1秒間待つのではなく、約1秒間待ってからすぐにすべてを印刷します。ここに私のコード:cout with this_thread :: sleep_for?

#include <iostream> 
#include <chrono> 
#include <thread> 

class OutputObject 
{ 
    int speed; 
public: 
    template<typename T> 
    void operator<<(T out) 
    { 
     std::cout << out; 
    } 
    void operator<<(const char *out) 
    { 
     int i = 0; 
     while(out[i]) 
     { 
      std::this_thread::sleep_for(std::chrono::milliseconds(speed)); 
      std::cout << out[i]; 
      ++i; 
     } 
    } 
    void operator=(int s) 
    { 
     speed = s; 
    } 
}; 

int main(int argc, char **argv) 
{ 
    OutputObject out; 
    out = 100; 
    out << "Hello, World!\n"; 
    std::cin.get(); 
    return 0; 
} 

私は間違って何をやっている?

編集:CoryKramerは、それがリアルタイムで動作するためにはstd :: flushが必要であると指摘しました。 std::cout << out[i];std::cout << out[i] << std::flush;に変更することで、私は私の問題を解決しました!

+2

「while」の中では、['std :: flush'](http://en.cppreference.com/w/cpp/io/manip/flush)すればよいでしょう。ループ – CoryKramer

+0

'std :: cout'への出力は* buffered *であることに注意してください。 –

答えて

2

ストリームはそうcoutは、あなたの前にフラッシュストリームテキストを印刷しません例えばendlフラッシュストリーミングと'\n'もストリームでバッファされたデータをフラッシュし、自動的にcinに呼び出す追加し、バッファを持っています。

while(out[i]) 
{ 
    std::this_thread::sleep_for(std::chrono::milliseconds(speed)); 
    std::cout << out[i]; 
    std::cout.flush(); 
    ++i; 
}