Eu já tentei várias coisas,
std::stringstream m;
m.empty();
m.clear();
os quais não funcionam.
Eu já tentei várias coisas,
std::stringstream m;
m.empty();
m.clear();
os quais não funcionam.
Respostas:
Para todos os tipos de biblioteca padrão, a função membro empty()
é uma consulta, não um comando, ou seja, significa "você está vazio?" não "jogue fora seu conteúdo".
A clear()
função de membro é herdada ios
e é usada para limpar o estado de erro do fluxo, por exemplo, se um fluxo de arquivo tiver o estado de erro definido como eofbit
(fim do arquivo), a chamada clear()
retornará o estado de erro para goodbit
(sem erro) .
Para limpar o conteúdo de a stringstream
, use:
m.str("");
está correto, embora esteja usando:
m.str(std::string());
é tecnicamente mais eficiente, porque você evita invocar o std::string
construtor que leva const char*
. Mas qualquer compilador hoje em dia deve ser capaz de gerar o mesmo código nos dois casos - então eu iria apenas com o que for mais legível.
Você pode limpar o estado de erro e esvaziar o stringstream em uma linha
std::stringstream().swap(m); // swap m with a default constructed stringstream
Isso efetivamente redefine m para um estado construído padrão
Essa deve ser a maneira mais confiável, independentemente do compilador:
m=std::stringstream();
mm.clear(); mm.str("");
fiz o truque. (sem C ++ 11, caso contrário, a troca seria melhor).
swap
seria melhor do que a atribuição de movimento?
meus 2 centavos:
isso parecia funcionar para mim no xcode e no dev-c ++, eu tinha um programa na forma de um menu que, se executado iterativamente de acordo com a solicitação de um usuário, preencheria uma variável stringstream que funcionaria bem na primeira vez que o código funcionasse. executar, mas não limparia a cadeia de caracteres da próxima vez que o usuário executar o mesmo código. mas as duas linhas de código abaixo finalmente limparam a variável stringstream todas as vezes antes de preencher a variável string. (2 horas de tentativa e erro e pesquisas no Google), aliás, usar cada linha por si só não funcionaria.
//clear the stringstream variable
sstm.str("");
sstm.clear();
//fill up the streamstream variable
sstm << "crap" << "morecrap";
É um problema conceitual.
Stringstream é um fluxo, portanto, seus iteradores são avançados, não podem retornar. Em um fluxo de sequência de saída, você precisa de um flush () para reinicializá-lo, como em qualquer outro fluxo de saída.
Estes não descartam os dados no stringstream no gnu c ++
m.str("");
m.str() = "";
m.str(std::string());
O seguinte esvazia o stringstream para mim:
m.str().clear();