Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Lectura datos.txt.

Estas en el tema de Lectura datos.txt. en el foro de C/C++ en Foros del Web. Hola, tengo un archivo de texto del que tengo que leer varias matrices. De estas matrices conozco el número de columnas pero no conozco el ...
  #1 (permalink)  
Antiguo 11/02/2014, 09:06
 
Fecha de Ingreso: febrero-2014
Mensajes: 3
Antigüedad: 10 años, 10 meses
Puntos: 0
Lectura datos.txt.

Hola, tengo un archivo de texto del que tengo que leer varias matrices. De estas matrices conozco el número de columnas pero no conozco el número de filas. Sin embargo, sé que están separadas por un carácter, por ejemplo #. 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
#

Quiero leer hasta que encuentre una # y que 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. Es decir, algo así:
while(carácter distinto de #)
guardar dato en matriz1
En el momento que encuentra la # empiezo a leer para una nueva matriz.
while(carácter distinto de #)
guardar dato en matriz2
y así sucesivamente con las 15 matrices que tengo

¿Podéis ayudarme? Gracias de antemano.
  #2 (permalink)  
Antiguo 11/02/2014, 10:51
 
Fecha de Ingreso: febrero-2014
Mensajes: 3
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Lectura datos.txt.

Yo me imaginaba que sería algo de este estilo, pero esto no funciona y encima no tengo ni idea de porque ni de como arreglarlo... La verdad es que toda mi vida he programado en Matlab y no se cómo trabajar con C++.

Código:
int main (void){
    
    float tabla1[][], tabla2[][], tabla3[][];
    
    ifstream datos("datos.txt");
    int i=0, j=0;
    
    
    while (!datos.eof()){
          if (datos != '#'){
          datos >> tabla1[i][j];
          if (j==3){
               i++;
               j=0;
               }
          else{
               j++;
               }
          }
          }
    
    i=0, j=0;
    
    while (!datos.eof()){
          if(datos != '#'){
          datos >> tabla2[i][j];
          if (j==4){
               i++;
               j=0;
               }
          else{
               j++;
               }
          }
          }

    i=0, j=0;
    
    while (!datos.eof()){  
          if (datos != '#'){    
          datos >> tabla3[i][j];
          if (j==1){
               i++;
               j=0;
               }
          else{
               j++;
               }
          }
          }
    
    datos.close();
}
  #3 (permalink)  
Antiguo 11/02/2014, 10:54
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Lectura datos.txt.

Pues eso, partes de la base de que el formato será correcto: espacio para separar campos, salto de linea para separar filas y # para separar matrices.

Si el filas*columnas de cada matriz es relativamente pequeño puedes cargar todo el archivo en memoria, tokenizarlo por # para obtener bloques matriz, luego para cada bloque matriz tokenizas por \n para obtener los bloques fila, y para cada fila tokenizas por espacios para obtener los campos. Usando la implementacion reentrante de strtok (no forma parte del estandar pero puedes encontrarla por ahi) no tendras problema para solucionarlo.

Otra forma consiste en leer lineas del archivo que seran las filas de la matriz, para cada fila tokenizas por espacios para encontrar los campos y los guardas en una matriz; cuando detectas que la linea es un # entonces olvidas la matriz destino actual y preparas una nueva.

Siento no ponerte nada de codigo
Saludos
vosk
  #4 (permalink)  
Antiguo 11/02/2014, 11:36
 
Fecha de Ingreso: febrero-2014
Mensajes: 3
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Lectura datos.txt.

Vale, he visto un ejemplo de dicha función y creo que seré capaz de hacerlo. Pero tengo una duda más. Es una función que utiliza cadenas de caracteres y yo necesito que las matrices que guardo sean valores float para utilizarlos posteriormente. ¿Me va a dar problemas o se puede utilizar también con valores reales?
Muchas gracias.
  #5 (permalink)  
Antiguo 11/02/2014, 11:49
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Lectura datos.txt.

Los campos tokenizados estan en formato texto, puedes usar atof para convertir de texto a coma flotante.

Te comenté lo de la strtok_r en vez de strtok porque necesitas guardar el dato previo tokenizado, cosa que strtok no hace. Si optas por leer linea por linea del archivo entonces la strtok_r no te hace falta y lo solucionas con strtok.

Otra cosa, intenta serializar la carga: evita hacer un ciclo para cada matriz, haz un unico ciclo que cargue todo, y algun control que determine en que matriz de destino guardar los valores.

Suerte con eso

Saludos
vosk

Etiquetas: lectura
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:25.