문자열 스트림에서 데이터를 추출하는 데 문제가있는 것 같습니다. 내 추출 시작 처음 두 문자가 누락 된 것 같습니다.문자열 스트림 추출이 작동하지 않습니다.
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은 무시됩니다. 하천의 시작에서 왜 시작되지 않습니까?건배, 세스
! 하지만 다른 방식으로 효과가 없어야하지 않습니까? – Seth
아니요, 없어야합니다. 이유를 이해하려면 int x = 1, y = 11, z = 111과 같은 작업을한다고 가정합니다. ss << x << y << z; - 문자열 결과는 "111111"이며, 스트림은 원하는대로 x, y 및 z를 추출하는 방법을 알려주지 않습니다 (다른 가능성과 반대 됨). 사실상 : 그 문자열 만 주어진다면, 인간은 말할 수 없습니다. 이것은 정말로 우리가 여기서 말하는 평범한 문자열입니다. 명시 적으로 작성하지 않으면 필드를 구분할 구분 기호가 없습니다. – Reunanen
정교화하기 위해, bool은 때때로 단일 문자가 아닌 (보통 8 비트) 정수로 취급되기 때문에 작동하지 않는 이유가 있습니다. 따라서 Pukku가 말했듯이, "정수"를 찾는 문자열을 읽을 때 하나가 멈추고 다른 하나는 공백이나 다른 구분자없이 시작한다는 것을 말하는 것은 불가능합니다. – SoapBox