2009-07-20 2 views
2

문자열 스트림에서 데이터를 추출하는 데 문제가있는 것 같습니다. 내 추출 시작 처음 두 문자가 누락 된 것 같습니다.문자열 스트림 추출이 작동하지 않습니다.

std::stringstream ss(
    std::stringstream::in | 
    std::stringstream::out 
    ); 

    bool bValid; 
    double dValue; 
    double dTime; 

    for((int i = 0; i < 5; i++) 
    { 
     bValid = getValid(); 
     dValue = getValue(); 
     dTime = getTime(); 

     // add data to stream 
     ss << bValid; 
     ss << dValue; 
     ss << dTime; 
    } 

    int strsize = ss.str().size(); 
    char* data = new char[strsize]; 
    std::strcpy(data, ss.str().c_str()); 

    // then do stuff with data 
    // ...... store data in an Xml Node as CDATA 

    // read data back 
    std::stringstream ssnew(std::stringstream in | std::stringstream out); 
    ss.clear(); 
    ss << getCharData(); // returns a char* and puts it in stream. 

    for(int i = 0; i < 5; i++) 
    { 
     ssnew >> bValid; // do something with bValid 
     ssnew >> dValue; // do something with dValue 
     ssnew >> dTime; // do something with dTime 
    } 

내가 데이터를 읽을 때 나는 추출 연산자를 사용할 때 "ssnew는"처음 두 문자를 건너 뛸 것으로 보인다 있다는 문제가 있습니다 :

는 다음 코드와 유사한 무언가가있다. 예를 들어, 디버거에서 stringstream에 "001.111.62.2003 ... etc"가 있음을 보여줍니다. 그러나 첫 번째 "ssnew >> bValid"이후에 bValid는 "true"가되고 dValue는 "0.111"이되고 dTime은 "0.62"가되어 스트림의 처음 두 개의 0은 무시됩니다. 하천의 시작에서 왜 시작되지 않습니까?

건배, 세스

답변

2

시도 :

// add data to stream 
    ss << bValid << " "; 
    ss << dValue << " "; 
    ss << dTime << " "; 
+0

! 하지만 다른 방식으로 효과가 없어야하지 않습니까? – Seth

+0

아니요, 없어야합니다. 이유를 이해하려면 int x = 1, y = 11, z = 111과 같은 작업을한다고 가정합니다. ss << x << y << z; - 문자열 결과는 "111111"이며, 스트림은 원하는대로 x, y 및 z를 추출하는 방법을 알려주지 않습니다 (다른 가능성과 반대 됨). 사실상 : 그 문자열 만 주어진다면, 인간은 말할 수 없습니다. 이것은 정말로 우리가 여기서 말하는 평범한 문자열입니다. 명시 적으로 작성하지 않으면 필드를 구분할 구분 기호가 없습니다. – Reunanen

+0

정교화하기 위해, bool은 때때로 단일 문자가 아닌 (보통 8 비트) 정수로 취급되기 때문에 작동하지 않는 이유가 있습니다. 따라서 Pukku가 말했듯이, "정수"를 찾는 문자열을 읽을 때 하나가 멈추고 다른 하나는 공백이나 다른 구분자없이 시작한다는 것을 말하는 것은 불가능합니다. – SoapBox

0

그래서 ssnew >> bValid은 "001"탐욕스럽게 먹게 작동하지 않았다 원래 코드가 추출 욕심이다 이유.

strstream은 stringstream을 사용하도록 권장되지 않습니다.

관련 문제