Pregunta

Estoy intentando leer el contenido de un archivo de texto en los atributos de una clase. El archivo está estructurado de tal manera que cada línea contiene toda la información necesaria para un objeto de la clase. Una línea podría ser:

TYC 9537 00066 1 341.76920751 -88.32499920  8.762  9.294 mc1 hd 210531        0.385   8.80 P F5 5  6440  F5 V

Lo que he estado haciendo es leer la línea del archivo a un arroyo con getline(), en función de esta manera:

void LoadFile( std::vector<TycDat*> & target , std::fstream & source )
{
    std::string line ;
    while( std::getline( source , line ) )
    {
        target.push_back( new TycDat ( line ) ) ;
    }
}

Cuando TycDat es el nombre de la clase, target es el vector estoy almacenarlo en y source es la secuencia de archivo ya se ha señalado en el fichero.

Dentro del constructor para TycDat que creó un std::istringstream asociado al parámetro std::string line y utiliza el operador >> para leer los valores en orden a los atributos. Esto funcionó en su mayor parte. Tuve que crear un par de matrices char a ser capaz de leer algunos de ellos, donde hd 210531 por ejemplo, corresponde a un string cual el operador >> tendría dividida.

Mi problema real viene con una de las últimas partes, en el ejemplo de la 8.80 P F5 5 6440. Donde dice F5 son de hecho dos valores, una letra y un número, que necesito para almacenar por separado como un char y un int. Por otra parte, el int al final podría no ser siempre allí.

Lo que estoy haciendo en este momento es, después de leer el P correctamente:

std::string aux_ ;
iss >> aux_ ;
TClass = aux_[0] ;    //     Temperature class (7)
if ( aux_.size() > 1 ) SClass = std::atoi( aux_.data()+1 ) ;  // SubClass

No me gusta que, sobre todo porque estoy haciendo una nueva string. Pero no podía encontrar la manera de hacer que funcione correctamente. El problema está en la división de la palabra aparte (supongo que podría ignore un personaje y luego usar TClass = iss.get() para obtener TClass, pero no sé cómo comprobar que existe el siguiente valor antes de leerlo en.

Hmm, podría peek para buscar un valor diferente de ' ', a continuación, utilizar el operador >> ....

Bueno, voy a tratar de que supongo y le permiten saber cómo va. Gracias por la ayuda. Cualquier otro comentario se aprecian. Me siento mal por borrar la pregunta después de escribir todo esto.

¿Fue útil?

Solución

Mi sugerencia sería tener un vistazo a Boost.Spirit. Se permitirá expresar el formato de la cadena de entrada de forma natural, y hará cambios en el futuro más fácil si (cuando!) Los cambios de formato de entrada. Como beneficio adicional, que va a correr mucho más rápido en tiempo de ejecución! http: //www.boost. org / doc / libs / 1_44_0 / libs / espíritu / doc / html / espíritu / introduction.html Buena suerte

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top