2013-05-15 1 views
4
std::string s; 
std::stringstream ss; 
ss << "a=b+c" << std::endl << "d=e+f"; 

std::getline(ss, s, '='); // gives me "a" 
std::getline(ss, s);  /* gives me "b+c" <- just want to peek: don't 
                want to change state of ss */ 
std::getline(ss, s, '+'); // BUT still want "b" here, not "d=e" 

s 지금 이제 "a"을 포함, 어떻게해야합니까 들여다 라인 ("b+c")의 나머지 문자에? 즉,이없는 은 다음 작업을 다음 줄에서 시작하게합니까?getline을 사용한 후 나머지 stringstream 문자를 들여다 보는 방법은 무엇입니까?

(예 인위적인, 나도 알아.)

답변

3

당신은 다음과 같이 IStream을 :: seekg()를 사용하여 이제 stringstream을 되돌릴 수 있습니다 (I는 구현 모르는) :

ss.seekg(ss.beg); 

이 그럼 당신은 모든 것을 다시 읽을 수 있습니다. 이것은 메모리를 절약하기 때문에 새로운 것을 만드는 것보다 낫습니다. 그리고 조금 더 빠릅니다.

+0

감사합니다. 유망 해 보입니다.'seekg'를 처음부터 시작하고 싶지 않다면, 어떻게 문자열 스트림의 현재 위치를 얻을 수 있습니까? (그래서 나는 그 위치를 저장하고 나중에'seekg'를 저장 할 수 있습니다)? – mchen

+0

"''''.cur'''를 사용할 수 있다고 생각하지만 100 % 확실하지는 않습니다. 사용해보기 : – Anickyan

+0

아니요, 표시되지 않습니다. 좋은 덩어리를 꺼내야하는'getline'을 사용한 후에도 1을 보여줍니다. – mchen

1

당신은 후 s에서 새 stringstream을해야 하나 : 다음 대신

std::getline(ss, s);  // gives me "b+c" 
std::stringstream ss2(s); 
std::getline(ss2,s, '+'); // will give b and maintain position in original ss 

또는 사용

std::getline(ss, s, '+'); // will give b 

편집 : 두 번째 옵션은 ss의 상태를 변경하므로 편집 기준에 맞지 않습니다.

+0

나머지 줄 * (' "b + c"')에서'peeking '하는 대신에 나머지 * 문자열 * (''b + c \ nd = e + f'')? 그게 더 쉬울까요? 나는 남아있는 모든 성격을 가진 완충 대원이있을 것을 기대하고 있었다. – mchen

1

문제에 대한 간단한 해결책은 다른 std::stringstreams 위해를 사용하는 것입니다 :

std::getline(ss, s, '='); // get "a" 
std::getline(ss, s); 

std::stringstream ss2(s); // create a stringstream with "b+c" 
std::getline(ss2, s, '+'); // gets "b" 

편집 :가 그럼 다시, 왜 "b+c"을 읽는 대신에 단지 다음 "c" 먼저 "b"을 받고?

+0

실례, 죄송합니다. – mchen

+0

감사합니다. ss 내의 나머지 문자열 전체에서'peek'을 어떻게하면 좋을까요? – mchen

+0

peek이 하나의 문자를 얻었고 적합하지 않을 수 있다는 것을 알았을 때 내 코멘트를 삭제했습니다. 확실하지. –

3

보십시오 : 그것은 EOF 전에 발견되면 위와

std::getline(ss, s, '=');      // gives me "a" 
std::getline(ss, s);       // gives me "b+c" 
ss.seekg(-(s.size()+1) ,std::ios_base::cur); // Roll back 
               // Need to +1 becuase we throw away a character 
               // with std::getline() that is not in the string. 

std::getline(ss, s, '+');      // gives me "b" 

문제는 그 표준 :의 getline이다()는 '\ n을'을 버려야합니다. 그러나 그것이 처음으로 eof를 발견하면 +1은 잘못된 장소에 우리를 넣습니다. 그래서 위의 예를 들어 작동하지만 당신은 모든 라인은 '\ n을'에 의해 종료되는 것은 보증되지 않는 한 그것은 마지막 줄에 실패합니다

해당하는 것은 보증 제공 할 수없는 경우 그래서 우리는 tellg()를 사용할 수 있습니다

std::getline(ss, s, '=');      // gives me "a" 
std::streampos save = ss.tellg(); 
std::getline(ss, s);       // gives me "b+c" 
ss.seekg(save);        // Roll back 


std::getline(ss, s, '+');      // gives me "b" 
+0

네 ...'tellg' 만이 바이너리 모드로 갈 수있는 유일한 방법입니다. – Potatoswatter

+0

@Potatoswatter : 또는 우리가 시도 할 수 있습니다 :'ss.seekg (- (s.size() + (ss? 1 : 0)), std :: ios_base :: cur);'아마도 같은 플래그를 리셋해야 할 것입니다 시각. 그러나 그것은'tellg()'버전에서도 마찬가지입니다. –

관련 문제