문자열 스트림 변수를 어떻게 지우나요? 이미 몇 가지를 시도했지만 std::stringstream m; m.empty(); m.clear(); 둘

이미 몇 가지를 시도했지만

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

둘 다 작동하지 않습니다.



답변

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

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

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

m.str("");

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

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

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


답변

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

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

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


답변

m.str("");

작동하는 것 같습니다.


답변

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

m=std::stringstream();

답변

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

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

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

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

답변

내 2 센트 :

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

//clear the stringstream variable

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

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

답변

개념적 문제입니다.

Stringstream은 스트림이므로 반복자가 전달되어 리턴 할 수 없습니다. 출력 문자열 스트림에서 다른 출력 스트림과 마찬가지로 flush ()를 다시 초기화해야합니다.