C ++ StringStream retornando personagem extra?
Pergunta
Eu tenho tentado usar a classe C ++ StringStream para fazer algumas manipulações de cordas relativamente simples, mas estou tendo um problema com o método get (). Por algum motivo, sempre que eu extraí o caractere de saída por caractere, ele anexa uma segunda cópia da letra final.
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main() {
stringstream ss("hello");
char c;
while(!ss.eof()) {
ss.get(c);
cout << "char: " << c << endl;
}
return 0;
}
A saída do programa é:
char: h
char: e
char: l
char: l
char: o
char: o
Qualquer ajuda que você possa me dar sobre isso seria apreciada.
Solução
No final do fluxo ss.eof()
Ainda não sabe que o final do fluxo será alcançado em breve, mas a extração a seguir de um personagem falha. Desde que a extração falhou porque o final do fluxo foi alcançado, c
não é alterado. Seu programa não reconhece isso ss.get(c)
falhou e imprime esse valor antigo de c
novamente.
Uma maneira melhor de verificar se ainda existe um personagem que possa ser lido no fluxo seria um loop como este:
while (ss.get(c)) {
cout << "char: " << c << endl;
}
Outras dicas
é por causa da ordem do loop. Sua leitura do 0 e EOF.
reordenar seu código como este
int main() {
stringstream ss("hello");
char c;
ss.get(c);
while(!ss.eof()) {
cout << "char: " << c << endl;
ss.get(c);
}
return 0;
}
O sinalizador EOF é definido apenas se você tentar ler além do final do arquivo. O código a seguir corrige o problema testando o EOF após o get () em vez de antes dele:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main() {
stringstream ss("hello");
char c;
while(1) {
ss.get(c);
if(ss.eof())
break;
cout << "char: " << c << endl;
}
return 0;
}