下面的代碼只是簡單地測試在std::stringbuf
上使用std::istream
read
時調用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.1和libC++。
謝謝!
更新:
我只是做了一個完全獨立的測試,並在我看來,這是在的libC++實現,因爲這不符合libstd ++發生一怪事。有人可以用其他實現來測試這個嗎?這是一個錯誤還是隻是一個實現的差異(對我來說感覺非常錯誤)。我更新了上面的代碼,以便將其複製並粘貼到任何main.cpp中。
UPDATE2:
畢竟它是在libc中++中的錯誤,請參閱:http://llvm.org/bugs/show_bug.cgi?id=13113。如果你自己編譯libC++,錯誤應該消失,我會很快嘗試。
當它經過位置3到流尾時,它可能會調用下溢? – 2012-06-14 16:57:25
但爲什麼它應該通過位置3?我希望它在隨後的get()或read()及其同級調用中通過位置3。 – moka