2012-10-16 14 views
5

Ad esempio, quando l'analisi di un file di testo, a volte questo file di avere cose come questa:Come verificare se stringstream >> stringa non metterà nulla sulla stringa?

keyword a string here 
keyword another string 
keyword 
keyword again a string 

nota che la linea 3 ° hanno una stringa vuota (nulla o spazi bianchi) .. Il fatto è che quando si do stringstream >> laststring e stringstream hanno una stringa vuota (null o solo uno spazio bianco), non sovrascriverà la "laststring", non farà nulla. C'è comunque la possibilità di verificare questa situazione prima della mano? Non voglio creare una stringa vuota temporanea solo per verificare che sia ancora vuota dopo stringstream >>, sembra zoppa.

risposta

15

Quando non è possibile leggere dal flusso - i suoi cambiamenti di stato in modo che quando la fusione di bool restituirà falso:

bool read = (ss >> laststring); 

Vedi ideone example

+0

ninja! questo è, sto solo aspettando i 5 minuti per accettare la risposta. – Icebone1000

1

si può sapere solo dopo cercando di leggere se ci fosse qualcosa di o no. Che cosa si potrebbe essere in grado di fare è di saltare spazi e vedere se c'è un non-spazio nella posizione successiva:

if ((in >> std::ws).peek() != std::char_traits<char>::eof()) { 
    ... 
} 

Dato che le stringhe vuote sono a buon mercato per creare, non vorrei perdere tempo e cerco di leggere il stringa. Si noti, tuttavia, che la lettura dagli stream non è basata sulla linea, vale a dire, nel tuo caso sopra devi prima dividere le righe o usare qualcosa come std::getline() per leggere la seconda parte della riga.

+0

Dal testo della domanda, penso che abbia già un 'getline', e stia leggendo dal stringing. altrimenti, la lettura non avrebbe "una stringa vuota" e andrebbe alla riga successiva. –

+0

@MooingDuck: Beh, dal momento che è preoccupato di creare una stringa vuota, sembra strano prima leggere in una riga ;-) Detto questo, ho letto la domanda come se leggessi una singola riga. Altrimenti, saltare gli spazi bianchi non funzionerebbe. –

0

È possibile utilizzare getline per leggere una riga dal file. Quindi, copia la linea in un flusso di stringhe e leggi le parole dal flusso di stringhe una alla volta. I flussi smetteranno automaticamente di essere letti quando finiranno le linee/le parole.

// open file 
std::ifstream fin("text.txt"); 

// 'iterate' through all the lines in the file 
unsigned lineCount = 1; 
std::string line; 
while (std::getline(fin, line)) 
{ 
    // print the line number for debugging 
    std::cout << "Line " << lineCount << '\n'; 

    // copy line into another stream 
    std::stringstream lineStream(line); 

    // 'iterate' through all the words in the line 
    unsigned wordCount = 1; 
    std::string word; 
    while (lineStream >> word) 
    { 
     // print the words for debugging 
     std::cout << '\t' << wordCount++ << ' ' << word << '\n'; 
    } 
} 

è necessario includere iostream, fstream, sstream e string.

+0

praticamente quello che sto facendo, quello che non sapevo è il controllo dell'operazione come bool. – Icebone1000

Problemi correlati