Domanda

Sono stato tentando di utilizzare la classe stringstream C ++ per fare alcuni relativamente semplici manipolazioni di stringhe, ma sto avendo un problema con il metodo get (). Per qualche motivo ogni volta che ho estratto il personaggio di uscita per carattere si aggiunge una seconda copia della lettera finale.

#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;
}

L'output del programma è:

char: h
char: e
char: l
char: l
char: o
char: o

Tutto l'aiuto che può darmi su questo sarebbe apprezzato.

È stato utile?

Soluzione

Al termine del ss.eof() flusso non sa ancora che la fine del flusso sarà raggiunto presto, ma il seguente estrazione di un personaggio fallisce. Poiché l'estrazione riuscita perché il fine del flusso è stato raggiunto, c non viene modificata. Il vostro programma non riconosce che ss.get(c) fallito e stampe che vecchio valore di c di nuovo.

Un modo migliore per verificare se c'è ancora un personaggio che può essere letto dal flusso sarebbe un ciclo come questo:

while (ss.get(c)) {
   cout << "char: " << c << endl;
}

Altri suggerimenti

la sua causa dell'ordine del ciclo. La vostra lettura del \ 0 e EOF.

riordinare il vostro codice come questo

int main() {
   stringstream ss("hello");
   char c;

   ss.get(c);
   while(!ss.eof()) {
      cout << "char: " << c << endl;
      ss.get(c);
   }
   return 0;
}

Il flag EOF è impostata solo se si tenta di leggere oltre la fine del file. Il seguente codice risolve il problema verificando per EOF dopo la get () al posto di prima:

#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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top