Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/11/2014, 05:33
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: leer fichero con registro de variables y valores c++

Usa un mapa:

Código C++:
Ver original
  1. #include <iomanip>
  2. #include <iostream>
  3. #include <map>
  4.  
  5. int main( )
  6. {
  7.   std::map< std::string, int > tablaValores;
  8.  
  9.   tablaValores[ "s123456" ] += 45;
  10.   tablaValores[ "s893264" ] += 125;
  11.   tablaValores[ "s893264" ] += 32;
  12.   tablaValores[ "s123456" ] += 5;
  13.   tablaValores[ "s112221" ] += 452;
  14.   tablaValores[ "s112221" ] += 30;
  15.   tablaValores[ "s893264" ] += 25;
  16.   tablaValores[ "s123456" ] += 15;
  17.   tablaValores[ "s112221" ] += 1;
  18.   tablaValores[ "s135133" ] += 11;
  19.  
  20.   for ( auto it = tablaValores.begin( ); it != tablaValores.end( ); ++it )
  21.   {
  22.     std::cout << it->first << "_"
  23.               << std::setfill ('0') << std::setw (5) // Esto es solo para rellenar con '0'
  24.               << it->second << std::endl;
  25.   }
  26. }

Salida:

Código:
s112221_00483
s123456_00065
s135133_00011
s893264_00182
Si te fijas, el mapa ordena los resultados. Si no deseas esta característica o necesitas que los datos se impriman en el mismo orden que en la entrada.

También puedes, con un poco más de programación, hacer que el mapa ordene según el orden que tu quieres, en este caso el orden sería el de aparición de los códigos.

Para ello necesitamos asociar a cada código un index, esto lo podemos hacer con una clase tal que:

Código C++:
Ver original
  1. class Clave
  2. {
  3.   public:
  4.  
  5.     Clave( const char* codigo )
  6.       : _codigo( codigo ),
  7.         _index( GetIndex( codigo ) )
  8.     {
  9.     }
  10.  
  11.     std::string Codigo( ) const
  12.     { return _codigo; }
  13.  
  14.     int Index( ) const
  15.     { return _index; }
  16.  
  17.   private:
  18.  
  19.     static std::vector< std::string > _codigos;
  20.  
  21.     static int GetIndex( const std::string& codigo )
  22.     {
  23.       auto it = std::find( _codigos.begin( ), _codigos.end( ), codigo );
  24.       if ( it == _codigos.end( ) )
  25.       {
  26.         _codigos.push_back( codigo );
  27.         it = _codigos.end( ) - 1;
  28.       }
  29.  
  30.       return std::distance( _codigos.begin( ), it );
  31.     }
  32.  
  33.     std::string _codigo;
  34.     int _index;
  35. };
  36.  
  37. // Esta línea sirve únicamente para incializar el vector estático de códigos
  38. std::vector< std::string > Clave::_codigos;

Lo que hace básicamente es, al ingresar un código comprueba si dicho código ya tiene un índice asociado, si el índice no existe, crea uno nuevo.

Ahora necesitamos proporcionar al mapa algún mecanismo que permita ordenar los códigos en base a ese index... hay varias opciones para ello. Yo voy a optar por sobrecargar el operador de comparación:

Código C++:
Ver original
  1. bool operator<( const Clave& c1, const Clave& c2 )
  2. {
  3.   return c1.Index( ) < c2.Index( );
  4. }

Y ya tenemos todos los ingredientes necesarios. Solo nos falta actualizar la definición del mapa y listo:

Código C++:
Ver original
  1. int main( )
  2. {
  3.   std::map< Clave, int > tablaValores;
  4.  
  5.   tablaValores[ "s123456" ] += 45;
  6.   tablaValores[ "s893264" ] += 125;
  7.   tablaValores[ "s893264" ] += 32;
  8.   tablaValores[ "s123456" ] += 5;
  9.   tablaValores[ "s112221" ] += 452;
  10.   tablaValores[ "s112221" ] += 30;
  11.   tablaValores[ "s893264" ] += 25;
  12.   tablaValores[ "s123456" ] += 15;
  13.   tablaValores[ "s112221" ] += 1;
  14.   tablaValores[ "s135133" ] += 11;
  15.  
  16.   for ( auto it = tablaValores.begin( ); it != tablaValores.end( ); ++it )
  17.   {
  18.     std::cout << it->first << "_"
  19.               << std::setfill ('0') << std::setw (5) // Esto es solo para rellenar con '0'
  20.               << it->second.Codigo( ) << std::endl;
  21.   }
  22. }

Salida:

Código:
s123456_00065
s893264_00182
s112221_00483
s135133_00011