2009-09-10 17 views
5

Estoy buscando un buen ejemplo de cómo sobrecargar el operador de entrada de flujo (operador >>) para analizar algunos datos con formato de texto simple. He leído this tutorial pero me gustaría hacer algo un poco más avanzado. En mi caso, he corregido cadenas que me gustaría verificar (e ignorar). Suponiendo que el formato de punto 2D desde el enlace eran más comoEjemplo de sobrecarga del operador de extracción C++ >> para analizar datos

Point{0.3 => 
     0.4 } 

donde el efecto deseado es analizar los números 0,3 y 0,4. (Sí, esta es una sintaxis terriblemente tonta, pero incorpora varias ideas que necesito). En su mayoría sólo quiero ver cómo comprobar correctamente la presencia de cadenas fijas, ignoran los espacios en blanco, etc.

Actualización: Vaya, el comentario que hice a continuación tiene ningún formato (esta es mi primera vez que utiliza este sitio) me encontré con que los espacios en blanco se puede saltar con algo como

std::cin >> std::ws; 

Y para comer hasta cadenas tengo

static bool match_string(std::istream &is, const char *str){ 
    size_t nstr = strlen(str); 
    while(nstr){ 
     if(is.peek() == *str){ 
      is.ignore(1); 
      ++str; 
      --nstr; 
     }else{ 
      is.setstate(is.rdstate() | std::ios_base::failbit); 
      return false; 
     } 
    } 
    return true; 
} 

Ahora sería agradable ser capaz de obtener la posición (número de línea) de una error de sintáxis.

Actualización 2: Obtené los números de línea y comencé a trabajar en el análisis sintáctico, usando solo 1 caracter look-ahead. El resultado final se puede ver aquí en AArray.cpp, en la función parse(). El proyecto es una (de) serie de matriz similar a PHP de C++ serializable.

+0

No es el operador de "extracción" o "entrada de flujo", es el operador de "cambio de bit". Las versiones de flujo IO son en sí versiones sobrecargadas del operador C original, que es relativamente poco utilizado en la práctica. –

+1

Chris: Aunque no estoy en desacuerdo con usted, parece ser una práctica aceptada referirse a los operadores '>>' y '<<' de forma independiente como operadores de "entrada/salida de flujo continuo". Consulte las definiciones del glosario de Stroustrup de << and >>: http://www.research.att.com/~bs/glossary.html – GRB

+1

@GRB: la sobrecarga del operador no lo es. El operador de desplazamiento a la derecha bit a bit ha sido abusado por C++ stl. Considere el operador ^. Podría decidir utilizar la sobrecarga del operador para convertirlo en un operador de elevar al poder. Sin embargo, simplemente tiene la precedencia y la asociatividad incorrectas. Dado que no se pueden agregar nuevos operadores noveles, y la semántica de operadores existentes no se puede cambiar, Y la mecánica implícita en la terminología: "sobrecarga", el operador >> es el operador de desplazamiento a la derecha bit a bit, y todo lo demás se entiende como una forma sobrecargada . –

Respuesta

1

Su operador >> (istream &, objeto &) debe obtener datos del flujo de entrada, usando sus funciones de extracción formateadas y/o sin formatear, y ponerlo en su objeto.

Si quiere ser más seguro (después de una moda), construya y pruebe un objeto istream :: centinela antes de comenzar. Si encuentra un error de sintaxis, puede llamar al setstate(ios_base::failbit) para evitar cualquier otro procesamiento hasta que llame a my_stream.clear().

Consulte <istream> (y istream.tcc si está utilizando SGI STL) para ver ejemplos.