2012-08-24 23 views
12

Queste discussioni non mi rispondono:come riutilizzare stringstream

resetting a stringstream

How do you clear a stringstream variable?

 std::ifstream file(szFIleName_p); 
     if(!file) return false; 

     // create a string stream for parsing 

     std::stringstream szBuffer; 

     std::string szLine;  // current line 
     std::string szKeyWord; // first word on the line identifying what data it contains 

while(!file.eof()){ 

      // read line by line 

      std::getline(file, szLine); 

      // ignore empty lines 

      if(szLine == "") continue; 

      szBuffer.str(""); 
      szBuffer.str(szLine); 
      szBuffer>>szKeyWord; 

szKeyword conterrà sempre la prima parola, szBuffer non è essere ripristinato, non riesce a trovare un chiaro esempio su come usare stringstream.

nuovo codice dopo la risposta:

... 
      szBuffer.str(szLine); 
      szBuffer.clear(); 
      szBuffer>>szKeyWord; 
... 

Ok, questo è la mia versione finale:

 std::string szLine;  // current line 
     std::string szKeyWord; // first word on the line identifying what data it contains 

     // read line by line 

     while(std::getline(file, szLine)){ 

      // ignore empty lines 

      if(szLine == "") continue; 

      // create a string stream for parsing 

      std::istringstream szBuffer(szLine); 
      szBuffer>>szKeyWord; 
+0

possibile duplicato di [Come riutilizzare un ostringstream?] (Http://stackoverflow.com/questions/624260/how-to-reuse-an-ostringstream) – maxschlepzig

risposta

21

Non clear() il flusso di fatto dopo aver chiamato str(""). Dare un'altra occhiata a this answer, spiega anche perché è necessario reimpostare utilizzando str(std::string()). E nel tuo caso, puoi anche ripristinare i contenuti utilizzando solo str(szLine).

Se non si chiama clear(), le bandiere del flusso (come eof) non sarà ripristinato, con conseguente comportamento sorprendente;)

+0

accidenti, ho visto una discussione che diceva chiaramente cancella solo le flag di errore ..wtf man..puoi spiegarmi perché ho bisogno di entrambi? usare solo chiaro sembra funzionare ..? – Icebone1000

+0

Questi sono correlati. Se non chiami 'clear()', lo stream penserà che sia ancora nello stato 'eof'. –

+0

Un compito così chiaro importante al reset sta di nuovo mettendo il puntatore di ricerca (qualunque sia il suo nome) all'inizio? Alla fine, questo è quello che mi serve: szBuffer.str (szLine); szBuffer.clear(); – Icebone1000

7

Dipende da quello che stai facendo con esso. Generalmente è più semplice creare semplicemente un nuovo istringstream o ostringstream . Per "ripristinare" un flusso, devi cancellare il suo buffer, cancellare eventuali flag di errore, reimpostare eventuali flag di formattazione , oltre alla precisione e riempimento, re imbue con le impostazioni internazionali originali , e non dimenticare alcuna informazione di formattazione estesa generata con un valore restituito da xalloc. In sintesi, impossibile ottenere correggere.

E mentre ci sono, il vostro ciclo è sbagliato, e probabilmente causerà l'elaborazione dell'ultima riga due volte. file.eof() ha solo un significato utilizzabile dopo che l'input non è riuscito (e anche in quel caso, non è affidabile al 100%). Quello che vuoi è:

std::string line; 
while (std::getline(file, line)) { 
    if (!line.empty()) { 
     std::istringstream buffer(line); 
     // ... 
    } 
} 

(In realtà, probabilmente vuole tagliare trailing spazio bianco dalla linea prima della prova per vuoto.)

+4

Mi piace come ci siano un sacco di risorse là fuori che spiegano tutte quelle informazioni std ovvie là fuori, in un modo organizzato e ben documentato, non – Icebone1000

0

ss è stringstream. Utilizzare

  • primo passaggio: ss.clear();
  • secondo passaggio: ss.str ("");

per riutilizzare lo stringstream: cancellare completamente il flusso di stringhe.

1

Nella maggior parte dei casi, è più semplice creare un nuovo istringstream o ostringstream invece di reimpostare gli stessi.

Tuttavia, se si desidera a risentirsi loro:

  • bandiere Resent del flusso (per evitare un comportamento imprevisto) utilizzando clear().

  • Mentre è possibile correggere il contenuto di stringstream utilizzando str (""), per motivi di efficienza potremmo preferire str(std::string()).

0

Se avete il flusso in un membro della classe, uso unique_ptr<stringstream>, poi basta reset(new stringstream(...)) per riutilizzarlo.