2010-05-04 14 views
18

Ho un codice per leggere i file con numeri float sulla linea memorizzati in questo modo: "3.34 | 2.3409 | 1.0001 | ... | 1.1 |". Vorrei leggerli utilizzando istringstream, ma non funziona come ci si aspetta:C++ - ripetutamente usando istringstream

string row; 
    string strNum; 

    istringstream separate; // textovy stream pro konverzi 

    while (getline(file,row)) { 
     separate.str(row); // = HERE is PROBLEM = 
     while(getline(separate, strNum, '|')) { // using delimiter 
     flNum = strToFl(strNum); // my conversion 
     insertIntoMatrix(i,j,flNum); // some function 
     j++; 
     } 
     i++; 
    } 

Al punto marcato, fila viene copiato nel flusso separato solo la prima volta. Nella prossima iterazione non funziona e non fa nulla. Mi aspettavo che fosse possibile utilizzarle più volte senza dover costruire un nuovo oggetto istringstream in ogni iterazione.

risposta

24

Dopo aver impostato la riga nella istringstream ...

separate.str(row); 

... azzerarlo chiamando

separate.clear(); 

Questo cancella tutti i flag iostate che sono impostati nella precedente iterazione o impostando la stringa. http://www.cplusplus.com/reference/iostream/ios/clear/

+1

Grazie mille. Questa è un'informazione molto importante che mi mancava in molti codici;) – Naomak

+0

In realtà deve essere dopo? Penso che puoi chiarirlo anche prima. – CashCow

5

È necessario aggiungere una riga separate.clear(); dopo separate.str(row) per cancellare i bit di stato, altrimenti il ​​eofbit viene impostata e la successiva legge fallire.

Problemi correlati