Newsgroup: it.comp.lang.c++
Titolo: Problemi con stringstream

Ciao.
Secondo la documentazione, basic_istringstream::str()  ritorna un oggetto
string di tipo string_type (basic_string) e
str(const string_type& str) azzera il buffer dello stream.
Lo snippet riportato di sotto genera praticamente porcheria. Dove sbaglio?
Nota: Lo snippet assume che il file ascii letto contenga dei caratteri >
(tipico dei files html).
Il compilatore e' Borland C++ 4 Professional.
Ciao e grazie
Alessandro
#include <sstream>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
   const char term = '>'
   const string filename "test.htm";
   fstream f (filename);
   stringstream input;
   input.unsetf(ios::skipws); /* default e' di ignorare whitespaces */
   input  << f.rdbuf();
   char ch;
   ostringstream sbuf;
   while (input >> ch) {
      sbuf << ch;
      if (ch == term)
         sbuf << ends;
         cout << sbuf.str() << endl;
         sbuf.str("");
      }
   }
   cin.get();
   return 0;
}

    fstream f (filename);
fstream f (filename.c_str());
EMG


Ciao Enrico.
Come avrai certamente capito, ho apportato delle veloci correzioni al codice
proprio prima di postarlo per renderlo puu' leggibile,e, da sciocco, non
l'ho ricontrollato.
Mi scuso e me ne vergogno.
Ciao e grazie
Ale

Scusandomi ancora per aver postato uno snippet che non compila, riporto di
seguito la versione corretta che dimostra il mio problema.
Per ricapitolare:
Il mio dubbio e' sull'uso di stringstream. Lo snippet ne utilizza due, uno
in input/output (input) e uno di output (sbuf).
Quest'ultimo, in certe condizioni deve essere azzerato, e qui credo sorge il
problema.
L'istruzione sbuf.str("") dovrebbe fare proprio questo. Quando la uso invece
il programma non funziona e genera garbage.
Da notare che il problema non si manifesta se:
a) il file letto e' molto piccolo (sotto 1K)
b) se invece di inizializzare  input con rdbuf() lo inizializzo come segue:
    string s;
    s = "qualiasi html snippet"
    input (s);
Credo quindi che il problema stia nella sincronizzazione e bufferizzazione
degli streams.
Avete qualche idea?
Ciao e grazie ancora
#include <fstream>
#include <sstream>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
   const char term = '>';
   const string filename = "any_html_file.htm";
   fstream f (filename.c_str());
   stringstream input;
   input.unsetf(ios::skipws); /* default e' di ignorare whitespaces */
   input  << f.rdbuf();
   char ch;
   ostringstream sbuf;
   while (input >> ch) {
      sbuf << ch;
      if (ch == term) {
         sbuf << ends;
         cout << sbuf.str() << endl; /**/


 ha scritto:



Ciao Simone
Grazie per la risposta.
freeze, per quanto ne so', e' legato agli ormai deprecati strstream buffers.
Questi infatti ritornavano dei char*, e una volta che usavi str() per
ottenere un puntatore, avevi il problema di come poter cancellare il buffer,
e quindi usavi freeze per congelare il buffer. In teoria, gli stringstream
dovrebbero non avere questo problema. Inoltre il metodo str() ritorna una
basic_string e non piu' un char*.
Un collega che dispone di VC++ sp6 mi ha confermato che il mio snippet
funziona benissimo, il che mi porta a pensare che sia un problema
dell'implementazione STL che il mio compilatore usa (Rogue Wave / Borland
C++4 sp1).
Ciao
Alessandro

Dopo aver avuto conferme da piu' persone che lo snippet funziona con vari
compilatori, sono giunto alla conclusione che si tratta di un problema del
mio compilatore.
Riposto quindi un follow up so borland.public.cppbuilder.language
Grazie e ciao
Alessandro

 seguito la versione corretta che dimostra il mio problema.
Magari potresti anche spiegare esattamente qual'č. A me il programma
funziona ma non so se fa quello che volevi.
EMG

 EMG
Alcuni colleghi che lavorano con gcc e con VC++ mi hanno dato risposte
simili alla tua.
Il comportamento del programma su tutte e 3 le stazioni windows che uso e'
decisamente bizzaro e difficile da non notare .
Per cui, come ho gia' spiegato nel subthread rispondento a Simone Manca,
<credo> di aver identificato il problema nel porting della STL che il mio
compilatore usa.
Ho quindi deciso di attivare un follow up sul newsgroup piu' appropriato per
il mio compilatore
Grazie
Ciao

 simili alla tua.
Io l'ho provato con il Borland C++ 5.5.1.
EMG