Ver Mensaje Individual
  #20 (permalink)  
Antiguo 28/12/2012, 04:35
kelvi
 
Fecha de Ingreso: diciembre-2012
Mensajes: 13
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Lectura de archivo en C++

Hola de nuevo,

He decidido eliminar los paquetes tipo '-' y tipo 'd' por lo que me deja solo dos listas '+' y 'r'. Los tipo '-' no me aportan nada y los 'd' solo necesito la cantidad la cual puedo sacar restando-le a los generados los recibidos.

Con el tema de la listas voy un poco perdido. Como podría recorrer-la? He visto que hay iteradores pero me pierdo en mi caso al tener el struct dentro de la lista. Sigo teniendo los campos separados igual que el struct? y si es así como puedo acceder a ellos para obtener los datos que necesito? Tendría que encontrar la manera de mover-me por las listas y así ir obteniendo los datos que necesito comparando las dos listas.

Te pongo el código para que veas como lo tengo ahora:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <fstream>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <sstream>
  8. #include <list>
  9.  
  10. using namespace std;
  11.  
  12. typedef struct {
  13.     char EV;
  14.     float T;
  15.     int E,R;
  16.     string P;
  17.     float G;
  18.     string FLA;
  19.     int FLU;
  20.     string O,D;
  21.     float S,I;
  22. } DADES_ARXIU;
  23.  
  24. enum ID_CAMPS{EV,T,E,R,P,G,FLA,FLU,O,D,S,I};
  25.  
  26. int main() {
  27.     int Pgenerats=0,Prebuts=0,Peliminats=0;//DADES PER ANALITZAR
  28.     int camp;//INDEX
  29.     //ESTRUCTURES
  30.     list <DADES_ARXIU> generats;
  31.     list <DADES_ARXIU> rebuts;
  32.     DADES_ARXIU camps;
  33.     DADES_ARXIU zero = {0, 0, 0, 0, "", 0, "", 0, "", "", 0, 0};
  34.     char *pch, *copia;
  35.     string linia;
  36.     //FITXER DE LECTURA
  37.     ifstream fitxer;
  38.     fitxer.open("Proces/outFiltrat.tr");
  39.     if (!fitxer) {
  40.         cerr << "Error al llegir fitxer";
  41.         return 1;
  42.     }
  43.  
  44.     while(getline(fitxer,linia)){  
  45.         copia = new char [linia.size()+1];
  46.         strcpy (copia,linia.c_str());
  47.         camp = EV;
  48.         pch = strtok(copia, " ");
  49.         while(pch != NULL){
  50.             switch(camp) {
  51.                 case EV: {                 
  52.                                 camps.EV = pch[0];
  53.                         }break;
  54.                 case T: {
  55.                     camps.T = atof(pch);                    
  56.                 }break;
  57.                 case E: {
  58.                     camps.E = atoi(pch);                    
  59.                         }break;
  60.                 case R: {
  61.                     camps.R = atoi(pch);                    
  62.                 }break;
  63.                 case P: {
  64.                     camps.P = pch;                    
  65.                         }break;
  66.                 case G: {
  67.                     camps.G = atof(pch);                  
  68.                 }break;
  69.                 case FLA: {
  70.                     camps.FLA = pch;               
  71.                         }break;
  72.                 case FLU: {
  73.                     camps.FLU = atoi(pch);      
  74.                 }break;
  75.                 case O: {
  76.                     camps.O = pch;              
  77.                         }break;
  78.                 case D: {
  79.                     camps.D = pch;                  
  80.                 }break;
  81.                 case S: {
  82.                     camps.S = atoi(pch);                    
  83.                         }break;
  84.                 case I: {
  85.                     camps.I = atoi(pch);                    
  86.                 }break;
  87.             }
  88.             pch = strtok (NULL, " ");
  89.             camp++;
  90.         }
  91.     if(camp != I+1){ cout << "ERROR DE FITXER"; return 1;}
  92.     if(camps.EV == '+'){Pgenerats++;generats.push_back (camps);}
  93.     if(camps.EV == 'r'){Prebuts++;rebuts.push_back (camps);}
  94.     //BUIDAR STRUCT
  95.     memcpy(&camps, &zero, sizeof(DADES_ARXIU));
  96.     //BUIDAR CHAR
  97.     delete[] copia;
  98.     }
  99.     while (!generats.empty()){
  100.     //AQUI TENDRIA QUE COGER UNA LINEA Y BUSCAR LA RECIBIDA EN LA OTRA LISTA
  101.     generats.pop_front();
  102.     }
  103.     Peliminats=Pgenerats-Prebuts;
  104.         fitxer.close();
  105.     generats.clear();
  106.     rebuts.clear();
  107.     return 0;
  108. }

Fran