Pergunta

Já tentei várias coisas,

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

ambos não funcionam.

Foi útil?

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top