문자열 스트림 변수를 어떻게 지우나요?


486

이미 몇 가지를 시도했지만

std::stringstream m;
m.empty();
m.clear();

둘 다 작동하지 않습니다.

답변:


771

모든 표준 라이브러리 유형에서 멤버 함수 empty()는 명령이 아니라 쿼리입니다. 즉 "비어 있습니까?" "내용을 버리지 마십시오".

clear()멤버 함수에서 상속 ios및 파일 스트림이 에러 상태가 설정되어있는 경우 등, 스트림의 에러 상태를 해제하기 위해 사용된다 eofbit(파일 끝) 다음 호출 clear()에 에러 상태를 다시 설정한다 goodbit(에러없이)를 .

의 내용을 지우려면 다음을 stringstream사용하십시오.

m.str("");

다음을 사용하더라도 정확합니다.

m.str(std::string());

std::string생성자를 호출하지 않기 때문에 기술적으로 더 효율적 const char*입니다. 그러나 요즘의 모든 컴파일러는 두 경우 모두 동일한 코드를 생성 할 수 있어야하므로 더 읽기 쉬운 것을 사용하십시오.


105
다음은 "clear ()"부분을 잊어 버린 경우에 발생합니다. stackoverflow.com/q/2848087/635549
galath

8
@KshitijBanerjee C ++에서 m.str ()과 m.str ( "")은 두 가지 다른 기능이라고 생각합니다. m.str ()은 매개 변수를 예상하지 않은 함수를 호출하는 반면 m.str ( "")은 const char * 매개 변수를 허용하는 함수를 호출합니다. m.str ()은 문자열을 반환 하는 get 함수 로 구현되었을 수 있지만 m.str ( "")은 set 함수 로 구현되었을 수 있습니다 .
Dinesh PR

4
galath가 말했듯이 m.clear ()를 추가하는 것도 매우 중요합니다. m.str ( ""); 외에도 그렇지 않으면 어떤 시점에서 문자열 스트림을 빈 문자열로 채우면 문제가 발생할 수 있습니다.
Sputnik

1
@anthropod 예 작년이었습니다. 나는 그것이 작동하는 것을 얻었습니다.
James

1
오 소년이 직관적입니다. C ++에 관한 다른 모든 것들과 마찬가지로!
sunny moon

47

오류 상태를 지우고 문자열 스트림을 모두 한 줄에 비울 수 있습니다.

std::stringstream().swap(m); // swap m with a default constructed stringstream

이것은 효과적으로 m을 기본 구성 상태로 재설정합니다


3
이것은 다른 모든 답변과 비교할 때 가장 효율적이고 우아한 방법입니다. 그러나 std :: stringstream :: swap은 c ++ 11 기능이며이 솔루션은 이전 c ++ 11 컴파일러에서는 작동하지 않습니다.
101010

4
아직 GNU에서 누락 기능은 g ++ v4.8 참조 stackoverflow.com/questions/24429441/...을
요아킴 W를

7
@ 101010 : 이동 할당보다 어떻게 교환이 더 낫습니까?
중복 제거기

2
@ AsetD : 그것이 예외가 아니더라도 기본 구성 임시를 잊었습니까?
중복 제거기

3
이것은 효율적이지 않습니다. 원래 ss를 다시 사용하고 싶을 때. 그것은 나를 위해 빈 교환합니다.
Zhang


33

컴파일러와 상관없이 가장 안정적인 방법이어야합니다.

m=std::stringstream();

2
내 의견으로는 m.str ( ""); 내가 시도한 모든 값이 빈 값으로 고정되도록했습니다. 그러나이 사용하여 그 문제가없는
gelatine1

3
나는 똑같은 문제에 mm.clear(); mm.str("");부딪쳤다. (C ++ 11이 없으면 스왑이 더 좋습니다).
hochl

1
@ hochl : swap이동 할당보다 왜 좋을까요 ?
중복 제거기

4
모든 상황에 좋지는 않습니다. mm.str ( "")는 그렇지 않을 때마다 버퍼를 다시 할당합니다.
Shital Shah

3
문자열 스트림 객체를 플러시하는 주요 사용 사례는 불필요한 문자열 스트림 인스턴스화를 방지하기 위해 스레드 로컬 문자열 스트림 객체를 유지하는 것입니다. 새 문자열 스트림 객체를 인스턴스화하면 전역 로케일 객체가 복사됩니다. 동시성 수준에서 처리하는 경우가 종종 있습니다.
Spacemoose

12

나는 항상 그것을 범위 내고있다 :

{
    std::stringstream ss;
    ss << "what";
}

{
    std::stringstream ss;
    ss << "the";
}

{
    std::stringstream ss;
    ss << "heck";
}

1
stringstream?
Robur_131

11

내 2 센트 :

이것은 xcode 및 dev-c ++에서 저에게 효과적 인 것처럼 보였습니다. 사용자 요청에 따라 반복적으로 실행하면 문자열 스트림 변수를 채워 코드가 처음 작동 할 때 메뉴 형식의 프로그램이 있습니다. 다음 번에 사용자가 동일한 코드를 실행할 때 문자열 스트림을 지우지 않습니다. 그러나 아래 두 줄의 코드는 문자열 변수를 채우기 전에 매번 문자열 스트림 변수를 정리했습니다. (2 시간의 시행 착오 및 Google 검색), btw, 각 줄을 자체적으로 사용하면 트릭을 수행하지 않습니다.

//clear the stringstream variable

sstm.str("");
sstm.clear();

//fill up the streamstream variable
sstm << "crap" << "morecrap";


-12

gnu c ++에서 stringstream의 데이터를 버리지 않습니다.

    m.str("");
    m.str() = "";
    m.str(std::string());

다음은 나를 위해 문자열 스트림을 비 웁니다.

    m.str().clear();

7
bernhardrusch가 작동하지 않는 것과 같은 이유로 인해 이것이 작동하는지 잘 모르겠습니다. .str () 함수는 복사본을 반환하며 복사본을 지우면 아무 작업도 수행되지 않습니다.
Verdagon

1
이 솔루션은 Microsoft Visual C ++에서는 작동하지 않습니다.
Zak

잘못되었습니다. 스트림 자체가 아닌 스트림에서 반환 된 문자열에 대해 Clear가 작동합니다.
Joey Carson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.