2012-02-10 22 views
9

¿Cómo puedo detectar si una línea está vacía?¿Cómo detectar líneas vacías mientras se lee desde el objeto istream en C++?

que tengo:

1 
2 
3 
4 

5 

estoy leyendo esto con istream r manera:

int n; 
r >> n 

quiero saber cuando llegue el espacio entre 4 y 5. Traté de leer como char y usando .peek() para detectar \ n pero esto detecta el \ n que va después del número 1. La traducción de la entrada anterior es: 1 \ n2 \ n3 \ n4 \ n \ n5 \ n si estoy en lo correcto ...

Como voy a manipular los datos, prefiero leerlos como si fueran en lugar de usar getline y luego convertir a int ...

+4

¤ Lea cada línea en 'std :: string' utilizando' std :: getline'. Verifique la longitud de la cuerda. Use p. Ej. a 'std :: istringstream' para leer elementos individuales de la línea de entrada. Esto también lo ayudará con una entrada errónea. Cheers & hth., –

+1

Oh, acabo de ver el último párrafo, que dice parafraseado: "No quiero usar la forma más fácil y razonable". En ese caso, hay virtualmente trillones de formas más complejas. Solo la imaginación de uno puede poner límites a las formas de hacer algo de una manera tontamente compleja. Cheers, –

+2

Bueno, no tienes que ser grosero. Al menos probé diferentes maneras antes de publicar esto. Solo quería saber si había otra forma. Solo estoy aprendiendo C++ atm. ¡Gracias por el comentario de istringstream, voy a intentar mezclarlo con la línea getline! Puede publicarlo como respuesta si lo desea, y lo aceptaré. – bb2

Respuesta

16

Se podría tener este aspecto:

#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; 
} 

de salida:

1 2 3 4 Empty line. 
5 Done. 

Espero que esto ayude.

+0

Necesito saber acerca de la línea vacía porque la entrada está dividida por bloques separados por ese espacio en blanco. Y necesito saber qué datos van a qué bloque. – bb2

+2

@ bb2: En ese caso, definitivamente usaría 'std :: getline' para leer cada línea como' cadena'. Luego puede crear 'istringstream' temporal basado en esa cadena y leer de ella. He editado mi respuesta. – LihO

+0

Acabo de notar que Alf P. Steinbach también recomendó la solución para comentar su pregunta. – LihO

4

Si realmente no quieres usar getline, este código funciona.

#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; 
     } 
    } 
} 

Pero tenga en cuenta que esto no es portátil. Cuando usa un sistema que tiene caracteres de líneas finales diferentes a '\ n', entonces sería un problema. Considere leer líneas enteras y luego extraer datos de ella.

+0

No es cierto que esto no sea portátil. Los caracteres de nueva línea del sistema se convierten ay desde '\ n'. – rasmus

Cuestiones relacionadas