2013-05-16 3 views
1

문자열 스트림 객체가 있습니다. 그것은왜 stringstream :: str()은 문자열을 자릅니다?

boost::iostreams::filtering_streambuf<boost::iostreams::input> inp; 

에서

stringstream ss; 
boost::iostreams::copy(inp,ss); 

를 통해 작성 실제로 내 ungzipped 파일을 보유하고있다. 내가 플러시 이제 stringstream 내용

std::ofstream ofs(path_to_file,std::ios_base::out|std::ios_base::binary); 
ofs << ss.rdbuf(); 

모든 것을 제기 할 경우

지금 괜찮습니다. 파일은 완전한 정확한 데이터로 채워져 있습니다.

는하지만 난 대신

std::string s = ss.str(); 

내용과 같은 구조 문자열을 파일로 플러싱의 경우하면 중간에 어딘가에서 잘립니다. 그것은 지속적인 오류가 아니며, 분명히 문자열 버퍼의 내용에 달려 있습니다.

콘텐츠는 여러 언어로 된 HTML 파일입니다.

무엇이 될 수 있습니까? 감사.

+0

때문에 널 종료 문자는 두 가지 상황에서 다르게 취급됩니다. (아마도) –

답변

5

콘텐츠가 잘 렸습니다. 어떻게 결정합니까? stringstream은 null 문자를 포함 할 수 있으며 std::string s = ss.str()은 그 null 문자와 그 뒤에 오는 문자를 std::string 개체로 복사합니다. 당신이 다음 C 스타일의 문자열로 std::string 객체의 내용을 처리 기능을 사용하는 경우

그러나,이 잘린 나타납니다

#include <sstream> 
#include <string> 
#include <iostream> 
#include <ostream> 
#include <string.h> 

using namespace std; 

stringstream ss; 

int main() 
{ 
    ss << 'a' << 'b' << 'c' << (char) '\0' << '1' << '2' << '3'; 

    string s = ss.str(); 

    cout << s.size() << endl; 
    cout << s.c_str() << " C string length: " << strlen(s.c_str()) << endl; 
    cout << s << endl; 
} 

는 다음과 같은 출력을 생성합니다

7 
abc C string length: 3 
abc 123 
+0

Michael,' '\ 0''의'char'에 대한 캐스트는 불필요합니다. 이미 문자 리터럴입니다. 또한 터미널에서 출력 할 때 주목할만한 가치가 있습니다 - "abc123"이 눈에 띄지 않습니다. 그러나 출력을 파일로 재지 정하면 16 진 덤프에 null이 표시됩니다. (아직도 내 upvote있어). –

+0

디버거에서 문자열이 확실히 잘린 것을 볼 수 있습니다. – Alexander

+0

VS 디버거를 사용하는 경우 기본 문자열 표시는 아마도 거짓말 일 것입니다. 즉, 'std :: string'(.NET 문자열 객체의 FYI와 마찬가지로)의 디버거 표시는 null 문자로 중지됩니다 오브젝트에 데이터가 포함되는 경우 예제 프로그램을 단계별로 실행 해 봅니다. 디버거는's.size()'와 프로그램의 마지막 줄에 더 많은 것이 있음을 분명히 보여 주지만's'의 값에 대해 "abc"를 표시합니다. 또한 디스플레이를 확장 할 수 있습니다 (디버거 디스플레이에서 변수 이름 옆에있는 '+'를 클릭하십시오). 그러면 널 문자를 포함하여 문자열의 각 요소가 나열됩니다. –

3

파일에 널 문자 기호 '\ 0'이있는 것 같습니다. 그것은 문자열의 끝으로 간주됩니다.

+0

이것은 정확하지 않습니다 :'std :: string'은 널 종료가 아닙니다. 예, 마지막 문자가 null (C 호환성의 경우)이지만 내포 된 null이 허용됩니다. 'strlen (s.c_str())'은 반드시's.size()'와 같을 필요는 없습니다. –

+0

가 동의하지만 std :: string은 아니지만 C-string은 null로 끝나는 문자 시퀀스 –