Ver Mensaje Individual
  #4 (permalink)  
Antiguo 15/12/2012, 11:09
kelvi
 
Fecha de Ingreso: diciembre-2012
Mensajes: 13
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Lectura de archivo en C++

Muchas Gracias por la rapidez. Ahora miro a ver si puedo hacerlo!!

Ahora tengo esto

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 <list>
  8.  
  9. using namespace std;
  10.  
  11. typedef struct {
  12.     char EV;
  13.     float T;
  14.     int E,R;
  15.     string P;
  16.     float G;
  17.     string FLA;
  18.     int FLU;
  19.     float O,D,S,I;
  20. } DADES_ARXIU;
  21.  
  22. enum ID_CAMPS{EV,T,E,R,P,G,FLA,FLU,O,D,S,I};
  23.  
  24. int main() {
  25.     list <DADES_ARXIU> llista;
  26.     DADES_ARXIU camps;
  27.     int camp;//incremental
  28.     char * pch;
  29.     string linia;
  30.  
  31.     //FITXER DE LECTURA
  32.     ifstream fitxer;
  33.     fitxer.open("TCL/out.tr");
  34.     if (!fitxer) {
  35.         cerr << "Error al llegir fitxer";
  36.         return 1;
  37.     }
  38.  
  39.     while(getline(fitxer,linia)){  
  40.    
  41.         camp = EV;
  42.         pch = strtok((char*)linia.c_str(), " ");
  43.         while(pch != NULL){
  44.             switch(camp) {
  45.                 case EV: {                 
  46.                                 //camps.EV = pch.c_srt();
  47.                         }break;
  48.                 case T: {
  49.                     //camps.T = atof(linia[pch]);                    
  50.                 }break;
  51.                 case E: {
  52.                     //camps.E = atoi(pch);                    
  53.                         }break;
  54.                 case R: {
  55.                     //camps.R = atoi(pch);                    
  56.                 }break;
  57.                 case P: {
  58.                     camps.P = pch;                    
  59.                         }break;
  60.                 case G: {
  61.                     //camps.G = atof(pch);                  
  62.                 }break;
  63.                 case FLA: {
  64.                     camps.FLA = pch;               
  65.                         }break;
  66.                 case FLU: {
  67.                     //camps.FLU = atoi(pch);      
  68.                 }break;
  69.                 case O: {
  70.                     //camps.O = atof(pch);                    
  71.                         }break;
  72.                 case D: {
  73.                     //camps.D = atof(pch);                    
  74.                 }break;
  75.                 case S: {
  76.                     //camps.S = atoi(pch);                    
  77.                         }break;
  78.                 case I: {
  79.                     //camps.I = atoi(pch);                    
  80.                 }break;
  81.             }
  82.             pch = strtok (NULL, " ");
  83.             llista.push_back (camps);
  84.             camp++;
  85.         }
  86.     if(camp>12){ cout << "ERROR DE FITXER"; return 1;}
  87.     }
  88.     fitxer.close();
  89.     return 0;
  90. }

Aunque parezca un separador, el campo SEP, en mi código FLA, realmente no es un separador son banderas, cada uno de los guiones puede tomar un valor char.

R2 y R3, en mi código O y D, también me interesaría verlos como char. Ya que por ejemplo si es 1.0 cada una de las dos cifras me indica una cosa distinta.

Cuando lanzo el programa me da errores dentro del switch por eso tengo las asignaciones puestas en comentarios.

Si quito este comentario:

Código C++:
Ver original
  1. //camps.EV = pch;

Me da el siguiente error:

lectura.cpp: En la función ‘int main()’:
lectura.cpp:45:35: error: conversión inválida de ‘char*’ a ‘char’ [-fpermissive]


Y si quito este:

Código C++:
Ver original
  1. //camps.T = atof(pch);

Me da este otro error:

lectura.cpp: En la función ‘int main()’:
lectura.cpp:48:30: error: conversión inválida de ‘char*’ a ‘unsigned int’ [-fpermissive]
/usr/include/c++/4.6/bits/basic_string.h:835:7: error: argumento de inicialización 1 de ‘std::basic_string<_CharT, _Traits, _Alloc>::reference std::basic_string<_CharT, _Traits, _Alloc>::operator[](std::basic_string<_CharT, _Traits, _Alloc>::size_type) [con _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc>::reference = char&, std::basic_string<_CharT, _Traits, _Alloc>::size_type = unsigned int]’ [-fpermissive]
lectura.cpp:48:31: error: conversión inválida de ‘char’ a ‘const char*’ [-fpermissive]
/usr/include/stdlib.h:145:15: error: argumento de inicialización 1 de ‘double atof(const char*)’ [-fpermissive]

Como podría solucionarlo??

Perdón si pregunto demasiado pero es que estoy hecho un lio.
Gracias otra vez!

Última edición por kelvi; 15/12/2012 a las 13:29