문제
나는 이미 여러 가지를 시도했지만
std::stringstream m;
m.empty();
m.clear();
둘 다 작동하지 않습니다.
해결책
모든 표준 라이브러리 유형에 대해 멤버 함수 empty()
명령이 아닌 쿼리입니다."당신은 비어 있습니까?" "내용을 버리십시오"가 아닙니다.
그만큼 clear()
멤버 함수는 다음에서 상속됩니다. ios
스트림의 오류 상태를 지우는 데 사용됩니다.파일 스트림의 오류 상태가 다음으로 설정된 경우 eofbit
(파일 끝), 호출 clear()
오류 상태를 다시 다음으로 설정합니다. goodbit
(오류 없음).
내용을 지우려면 stringstream
, 다음을 사용하여:
m.str("");
다음을 사용하더라도 정확합니다.
m.str(std::string());
호출을 피하기 때문에 기술적으로 더 효율적입니다. std::string
소요되는 생성자 const char*
.하지만 요즘 컴파일러는 두 경우 모두 동일한 코드를 생성할 수 있어야 합니다. 따라서 저는 더 읽기 쉬운 것을 선택하겠습니다.
다른 팁
한 줄에 오류 상태를 지우고 strignstream을 모두 비울 수 있습니다.
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++에서 작동하는 것 같았습니다. 사용자의 요청에 따라 반복적으로 실행하면 코드가 처음에 제대로 작동하는 stringstream 변수를 채우는 메뉴 형태의 프로그램이 있었습니다. 실행되지만 다음에 사용자가 동일한 코드를 실행할 때 문자열 스트림을 지우지 않습니다.그러나 아래 두 줄의 코드는 문자열 변수를 채우기 전에 매번 stringstream 변수를 지웠습니다.(2 시간의 시행 착오 및 Google 검색) btw, 각 줄을 자체적으로 사용하면 트릭을 수행하지 못할 것입니다.
//clear the stringstream variable
sstm.str("");
sstm.clear();
//fill up the streamstream variable
sstm << "crap" << "morecrap";
개념적인 문제입니다.
Stringstream은 스트림이므로 해당 반복자는 정방향이므로 반환할 수 없습니다.출력 문자열 스트림에서는 다른 출력 스트림과 마찬가지로 다시 초기화하려면 플러시()가 필요합니다.
이는 gnu C++의 문자열 스트림에 있는 데이터를 삭제하지 않습니다.
m.str("");
m.str() = "";
m.str(std::string());
다음은 나를 위해 문자열 스트림을 비웁니다.
m.str().clear();