2012-06-14 49 views
2

下面的代碼只是簡單地測試在std::stringbuf上使用std::istreamread時調用underflow的頻率。C++:std :: istream讀取及其對std :: streambuf下溢的調用

#include <iostream> 
#include <vector> 
#include <sstream> 

class TestStringBuf : 
public std::stringbuf 
{ 
public: 

    int_type underflow() 
    { 
     std::cout<<"TestStringBuf underflow"<<std::endl; 
     return std::stringbuf::underflow(); 
    } 
}; 

int main(int argc, const char * argv[]) 
{ 
    TestStringBuf buf; 
    std::iostream stream(&buf); 

    stream << "tesr"; 

    std::vector<char> data(4); 
    stream.read(&data[0], 4); 

    for(int i=0; i<data.size(); ++i) 
     std::cout<<data[i]; 
    std::cout<<std::endl; 

    return 0; 
} 

輸出爲:

TestStringBuf underflow 
TestStringBuf underflow 
test 

我的預期下溢只需進行一次調用,因爲我讀了目前在獲取區域中的字節如數,所以爲什麼要再次下溢?這是預期的行爲? 我在問,因爲我的自定義underflow方法可能會阻塞很長時間來讀取新的數據,所以在這種情況下,第二次調用underflow不是很理想。

我在Osx上使用鏗鏘3.1libC++

謝謝!

更新:

我只是做了一個完全獨立的測試,並在我看來,這是在的libC++實現,因爲這不符合libstd ++發生一怪事。有人可以用其他實現來測試這個嗎?這是一個錯誤還是隻是一個實現的差異(對我來說感覺非常錯誤)。我更新了上面的代碼,以便將其複製並粘貼到任何main.cpp中。

UPDATE2:

畢竟它是在libc中++中的錯誤,請參閱:http://llvm.org/bugs/show_bug.cgi?id=13113。如果你自己編譯libC++,錯誤應該消失,我會很快嘗試。

+0

當它經過位置3到流尾時,它可能會調用下溢? – 2012-06-14 16:57:25

+0

但爲什麼它應該通過位置3?我希望它在隨後的get()或read()及其同級調用中通過位置3。 – moka

回答

0

C++標準明確允許實現std :: basic_stringbuf將字符序列存儲在std :: basic_string中,而不是使用std :: basic_streambuf的內部緩衝區。

+0

我不知道這是如何涉及到這個問題。我只選擇了stringbuf作爲示例。從std :: streambuf直接繼承時,行爲是相同的。你能詳細說明你的意思嗎? – moka

+0

std :: streambuf提供了一個用於緩衝訪問其他地方的字符序列(RAM,文件,TCP流,...)的接口。但該標準沒有指定要使用多少緩衝。 – bjhend

+0

是啊我知道,我發現這個行爲時工作在一個自定義的std :: streambuf的TCP套接字。下溢在libC++中調用得太早,無緣無故會導致非常長的塊。 – moka

相關問題