2012-02-10 7 views
9

Come posso rilevare se una linea è vuota?Come rilevare le linee vuote durante la lettura dall'oggetto istream in C++?

ho:

1 
2 
3 
4 

5 

Sto leggendo questo con istream r così:

int n; 
r >> n 

Voglio sapere quando raggiungo lo spazio tra 4 e 5. ho provato a leggere come char e usando .peek() per rilevare \ n ma questo rileva il \ n che segue il numero 1. La traduzione dell'ingresso precedente è: 1 \ n2 \ n3 \ n4 \ n \ n5 \ n se ho ragione ...

Dal momento che sto per manipolare gli ints, piuttosto li leggerò come ints che usare getline e quindi la conversione in int ...

+4

¤ Leggere ogni riga in 'std :: string' usando' std :: getline'. Controlla la lunghezza della corda. Utilizzare per es. un 'std :: istringstream' per leggere i singoli elementi dalla riga di input. Questo ti aiuterà anche con input errati. Cheers & hth., –

+1

Oh, ho appena visto l'ultimo paragrafo, che parafrasato dice "Non voglio usare il modo più semplice e ragionevole". In quel caso ci sono virtualmente milioni di modi più complessi. Solo l'immaginazione può mettere limiti ai modi di fare qualcosa in modo sciocco-complesso. Saluti, –

+2

Okay, non devi essere scortese. Almeno ho provato diversi modi prima di postare questo. Volevo solo sapere se c'era un altro modo. Sto solo imparando C++ atm. Grazie per il commento istringstream, però, ho intenzione di provare questo mixato con il getline! Puoi postarlo come risposta se vuoi, e lo accetterò. – bb2

risposta

16

Potrebbe assomigliare a questo:

#include <iostream> 
#include <sstream> 
using namespace std; 

int main() 
{ 
    istringstream is("1\n2\n3\n4\n\n5\n"); 
    string s; 
    while (getline(is, s)) 
    { 
     if (s.empty()) 
     { 
      cout << "Empty line." << endl; 
     } 
     else 
     { 
      istringstream tmp(s); 
      int n; 
      tmp >> n; 
      cout << n << ' '; 
     } 
    } 
    cout << "Done." << endl; 
    return 0; 
} 

uscita:

1 2 3 4 Empty line. 
5 Done. 

Spero che questo aiuti.

+0

Ho bisogno di sapere sulla linea vuota perché l'input è diviso per blocchi separati da quello spazio vuoto. E ho bisogno di sapere quali dati vanno a quale blocco. – bb2

+2

@ bb2: In tal caso userei sicuramente 'std :: getline' per leggere ogni riga come' stringa'. Quindi puoi creare "istringstream" temporaneo basato su quella stringa e leggere da esso. Ho modificato la mia risposta. – LihO

+0

Ho appena notato che la soluzione è stata raccomandata anche da Alf P. Steinbach nel commentare la tua domanda. – LihO

4

Se davvero non si desidera utilizzare getline, questo codice funziona.

#include <iostream> 
using namespace std; 


int main() 
{ 
    int x; 
    while (!cin.eof()) 
    { 
     cin >> x; 
     cout << "Number: " << x << endl; 

     char c1 = cin.get(); 
     char c2 = cin.peek(); 

     if (c2 == '\n') 
     { 
      cout << "There is a line" << endl; 
     } 
    } 
} 

Ma essere consapevoli del fatto che questo non è portatile. Se utilizzi un sistema con caratteri di fine riga diversi da "\ n", allora sarebbe un problema. Considerare la lettura di intere righe e quindi estrarre i dati da esso.

+0

Non è vero che questo non è portabile. Il carattere di riga nuova del sistema viene convertito in e da '\ n'. – rasmus

Problemi correlati