Como você limpa uma variável stringstream?
-
09-06-2019 - |
Pergunta
Já tentei várias coisas,
std::stringstream m;
m.empty();
m.clear();
ambos não funcionam.
Solução
Para todos os tipos de biblioteca padrão, a função membro empty()
é uma consulta, não um comando, ou seja,Isso significa "você está vazio?" Não "jogue fora seu conteúdo".
O clear()
função de membro é herdada de ios
e é usado para limpar o estado de erro do fluxo, por ex.se um fluxo de arquivo tiver o estado de erro definido como eofbit
(fim do arquivo) e, em seguida, chamando clear()
irá definir o estado de erro de volta para goodbit
(sem erro).
Para limpar o conteúdo de um stringstream
, usando:
m.str("");
está correto, embora 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 em ambos os casos - então eu escolheria o que fosse mais legível.
Outras dicas
Você pode limpar o estado de erro e esvaziar o strignstream 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
m.str("");
parece funcionar.
Esta deve ser a maneira mais confiável, independentemente do compilador:
m=std::stringstream();
Estou sempre avaliando isso:
{
std::stringstream ss;
ss << "what";
}
{
std::stringstream ss;
ss << "the";
}
{
std::stringstream ss;
ss << "heck";
}
meus 2 centavos:
isso pareceu funcionar para mim em xcode e dev-c++, eu tinha um programa na forma de um menu que, se executado iterativamente conforme a solicitação de um usuário, preencheria uma variável stringstream que funcionaria bem na primeira vez que o código seria executado, mas não limparia o stringstream na 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 sempre antes de preencher a variável string.(2 horas de tentativa e erro e pesquisas no Google), aliás, usar cada linha por conta própria não resolveria.
//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 e não podem retornar.Em um stringstream 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();