2011-12-08 2 views
0

저는 과거에는 단일 스레드 내에서 (g ++ 4.5로) 문제없이 stringstream을 사용했습니다. 이제 같은 접근법을 시도했지만 g ++ 4.6에서 작동하지 않습니다. 내부 streambuf은 첫 번째 바이트 이상으로 채워지지 않습니다. g ++ 4.6 stringstream에 버그가 있습니까?

이 코드를 예기치 않게

#include <iostream> 
#include <sstream> 
using namespace std; 

int main(){ 
     stringstream pipe(ios_base::in|ios_base::out|ios_base::binary); 
     const char* in="lol"; 
     pipe.write(in, 4); 
     char out[4]={0}; 
     cout<<pipe.readsome(out, 4)<<" "<<out<<endl; 
} 

이 인쇄에 "1 L"을 고려하십시오.

stringstream을 사용하는 데 분명히 오류가 있습니까? 그렇지 않으면, 나는 g ++ 4.6 STL에 결함이 있다고 결론을 내려야한다.

P. 기본적으로 stringstream이하는 것과 관련된 stringbuf와 함께 iostream을 사용하여 동일한 결과를 얻었습니다.

+0

'readsome'은 1 바이트 만 읽습니다. 이해하는 한 올바른 동작입니다. 정확히 4 바이트를 읽으려면'read'를 사용하십시오. –

+0

예. 사실,이 코드는 g ++ 4.5에서 작동했습니다. 왜냐하면 streambuf 객체의 in_avail() 메서드가 올바른 바이트 양 (4)을 반환했기 때문입니다. 이제는 * always * 1을 반환하므로 readsome()은 4를 읽을 수 있다고하더라도 1 바이트 만 읽습니다. 응용 프로그램에서 읽을 수있는 바이트 수를 미리 알고 있어야합니다. –

+0

GCC 4.4.5를 사용하고 있고 in_avail은 나를 위해 1을 반환합니다. 버그 일 경우 꽤 오래된 것입니다. gcc 4.5에 액세스 할 수 없으므로 지금은 테스트 할 수 없습니다. –

답변

0

스펙을 다시 읽고 마침내이 코드를 사용하여 stringstream 파이프에서 사용 가능한 바이트 인 pipe.tellp()-pipe.tellg()을 검색하기로 결정했습니다. 아는 한 모든 것에 호환되므로 항상 작동해야합니다.

관련 문제