답변:
모든 표준 라이브러리 유형에서 멤버 함수 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=std::stringstream();
mm.clear(); mm.str("");
부딪쳤다. (C ++ 11이 없으면 스왑이 더 좋습니다).
swap
이동 할당보다 왜 좋을까요 ?
내 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 ()를 다시 초기화해야합니다.
gnu c ++에서 stringstream의 데이터를 버리지 않습니다.
m.str("");
m.str() = "";
m.str(std::string());
다음은 나를 위해 문자열 스트림을 비 웁니다.
m.str().clear();