Problema lectura de datos

Iniciado por Ockdatone, 11 Febrero 2014, 12:42 PM

0 Miembros y 2 Visitantes están viendo este tema.

Ockdatone

Buenos días, soy nuevo totalmente en C++ y lo primero a lo que me he tenido que enfrentar es a un problema muy complejo que tengo que resolver para mi doctorado. Obviamente los problemas comienzan nada más empezar con la lectura de datos que tengo que hacer, debido a que desconozco las dimensiones de los mismo. El tipo de datos es de este estilo:

1 2 3 4
#
11 20 53 89 68
98 65 59 86 38
11 28 73 64 58
#
235 236
278 958
985 642
285 852
374 591
#

La cuestión es que yo no voy a conocer el tamaño de las matrices que voy a tener en el fichero, con lo cual quiero leer el fichero de la siguiente manera.
Quiero que lea hasta que encuentre una # y me lo guarde en una matriz. Que siga leyendo hasta que encuentre otra # y me lo guarde en otra matriz distinta y así sucesivamente con las 20 o 30 matrices que utilice.
¿Podéis ayudarme? Gracias de antemano.

eferion

#1
Usa contenedores de la stl... así te puedes despreocupar del tamaño de cada matriz.

Código (cpp) [Seleccionar]

std::vector< std::vector< int > > matriz;

matriz.push_back( std::vecto< int >( ) ); // para insertar una nueva fila

matriz[ n ].push_back( valor ); // para insertar un nuevo valor en la fila n


O bien puedes crearte una clase Matriz que encapsule este trabajo para que su manejo sea de lo más simple:

Código (cpp) [Seleccionar]

class Matriz
{
 public:
   void NuevaFila( );
   void NuevoValor( int valor );

   int Filas( ) const;
   int Columnas( ) const;

   int Valor( int fila, int columna ) const;
 private:

   std::vector< std::vector< int > > _valores;
}


void Matriz::NuevaFila( )
{
 _valores.push_back( std::vector< int >( ) );
}

void Matriz::NuevoValor( int valor )
{
 _valores[ _valores.size( ) - 1 ].push_back( valor );
}

int Matriz::Filas( ) const
{
 return _valores.size( );
}

int Matriz::Columnas( ) const
{
 return _valores[ 0 ].size( );
}

int Matriz::Valor( int fila, int columna ) const
{
 return _valores[ fila ].at( columna );
}


Este diseño es, desde luego, mejorable, pero el código no deja de ser una idea sobre cómo solucionar tu problema.

Se me ocurren soluciones mucho más elaboradas y bonitas, pero se tarda más en diseñarlas.

Ockdatone

No me entero muy bien... Es que soy muy novato. Vamos a ver, yo lo que tengo es un archivo de datos, por ejemplo, datos.txt como el del ejemplo que puse. Cuando digo que no sé las dimensiones de las matrices (realmente no sé el número de filas, el de columnas sí, error mío al explicarme) es porque voy a leer distintos archivos de datos pues voy a tener varias instancias que es lo que me va a hacer variar el número de filas. Por tanto, no existe una forma de hacerlo del estilo,
while(carácter leído distinto de #)
añadir a matriz1
while(carácter leído distinto de #)
añadir a matriz 2
.
.
.
y así hasta que haya leído todas las matrices de mi .txt

Ya sé que no es muy elegante, pero eso es lo de menos, es por que sea sencillo para un novato.

Gracias

eferion

para la lectura de ficheros deberías mirar la clase istream.

La clase que yo te he propuesto es una forma de almacenar una matriz de tamaño desconocido... parte de la premisa de que las matrices a leer están bien formadas ( igual número de columnas en todas las filas ).

la idea a aplicar es más o menos así:

Código (cpp) [Seleccionar]

Matriz matriz;

matriz.NuevaFila( );

while ( !istream.eof( ) )
{
  if ( istream.get( ) == '#' )
    matriz.NuevaFila( );
  else
  {
    istream.unget( );
    int valor;
    istream >> valor;
    matriz.NuevoValor( valor );
  }
}


Ahora mismo no puedo ponerme con un diseño más elaborado, pero sirve para que te hagas una idea.