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

Error al leer el fichero txt

Estas en el tema de Error al leer el fichero txt en el foro de C/C++ en Foros del Web. Hola a todos: Estoy realizando un proyecto y tengo que leer de cada línea de un fichero "txt" dos bloques distintos. La estructura de la ...
  #1 (permalink)  
Antiguo 09/04/2011, 11:04
 
Fecha de Ingreso: abril-2011
Mensajes: 1
Antigüedad: 13 años
Puntos: 1
Error al leer el fichero txt

Hola a todos:

Estoy realizando un proyecto y tengo que leer de cada línea de un fichero "txt" dos bloques distintos.

La estructura de la línea es la siguiente, los bloques están separados por un espacio en blanco:
FECHA " " HORA " " PRODUCCIÓN " " MÓDULO
Ejemplo:
2008-01-02 12:00 273 82.04

Tengo que leer la producción y el módulo, con lo que la fecha y la hora al ser constantes, empiezo a leer a partir de la posición 17. El problema me da al leer caracter a caracter, si muestro la línea entera, la enseña sin problemas, en cambio, sin voy carácter a carácter, me muestra muchísima basura. Por más vueltas que le he dado no hay forma de encontrar el fallo, espero que me podáis echar una mano.

Os adjunto el código a continuación:

Código C++:
Ver original
  1. #include<iostream.h>
  2. #include<fstream.h>
  3. #include<stdio.h>
  4. #include<string.h>
  5. #include<conio.h>
  6. #include<stdio.h>
  7. #include<stdlib.h>
  8.  
  9.  
  10. void main()
  11. {
  12.   int i,p,m;
  13.   float modulo;
  14.   bool espacio,finlinea=false;
  15.   char c,linea[30],prod[5],mod[5];
  16.   ifstream MiArchivo;
  17.  
  18.   //ABRIMOS EL FICHERO
  19.   MiArchivo.open("c:\\datos.txt");
  20.  
  21.   if (!MiArchivo.fail())
  22.   {
  23.     while (!MiArchivo.eof() )
  24.     {
  25.       strcpy(linea,"");
  26.       strcpy(prod,"");
  27.       strcpy(mod,"");
  28.  
  29.       //LEEMOS LA LINEA
  30.       MiArchivo.getline(linea,sizeof(linea));
  31.  
  32.       i=17;
  33.       p=0;
  34.       m=0;
  35.       finlinea=false;
  36.  
  37.       //ESTE IF ESTÁ PARA SALTAR LINEAS QUE NO QUEREMOS PARA NADA
  38.       if(strlen(linea)>17)
  39.       {
  40.        while(i<30 && !finlinea)
  41.        {
  42.             c=linea[i];
  43.                 if(c==' ')
  44.                          espacio=true;
  45.             if(c=='/n')
  46.                 finlinea=true;
  47.              else
  48.                 {
  49.                          //SI TODAVIA NO HEMOS ENCONTRADO EL ESPACIO,ES LA PRODUCCION
  50.                          if(!espacio)
  51.                          {
  52.                                 prod[p]=linea[i];
  53.                                 p++;
  54.                           }
  55.  
  56.                           else
  57.                           {
  58.                                 mod[m]=linea[i];
  59.                                 m++;
  60.                           }
  61.                  }
  62.          i++;
  63.          }
  64.          cout<<"Produccion: "<<prod<<endl;
  65.          cout<<"Módulo: "<<mod<<endl;
  66.       }
  67.       else
  68.         cout<<linea<<endl;
  69.     }
  70.     MiArchivo.close();
  71.   }
  72.   else
  73.    printf ("No se pudo abrir el archivo.");
  74.   getch();
  75. }



Muchas Gracias

Un saludo

Última edición por Hetzfield; 09/04/2011 a las 12:59
  #2 (permalink)  
Antiguo 12/07/2011, 17:09
 
Fecha de Ingreso: abril-2011
Ubicación: Guadalajara, Jalisco, Mexico
Mensajes: 27
Antigüedad: 13 años
Puntos: 4
De acuerdo Respuesta: Error al leer el fichero txt

Pues vi tu codigo y me llamo la atencion, la verdad no supe que es lo que querias hacer pero pude corregir muchas cosas que te complicaban te dejo el codigo:
Código C++:
Ver original
  1. #include<iostream>
  2. #include<fstream>
  3. #include<cstring>
  4.  
  5.  
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10.     int i,p,m;
  11.     float modulo;
  12.     bool espacio,finlinea=false;
  13.     char c,linea[30],prod[5],mod[5];
  14.     ifstream MiArchivo;
  15.    
  16.     //ABRIMOS EL FICHERO
  17.     MiArchivo.open("datos.txt",ifstream::in);
  18.    
  19.     if (!MiArchivo.fail())
  20.     {
  21.         while (!MiArchivo.eof() )
  22.         {
  23.             strcpy(linea,"");
  24.             strcpy(prod,"");
  25.             strcpy(mod,"");
  26.        
  27.             //LEEMOS LA LINEA
  28.             MiArchivo.getline(linea,sizeof(linea));
  29.        
  30.             i=17;
  31.             p=0;
  32.             m=0;
  33.             finlinea=false;
  34.        
  35.             //ESTE IF ESTÁ PARA SALTAR LINEAS QUE NO QUEREMOS PARA NADA
  36.             if(strlen(linea)>=17)
  37.             {
  38.                 while((i < 30) && (!finlinea))
  39.                 {
  40.                     c=linea[i];
  41.                     if(c==32)//32 espacio en codigo ascii
  42.                         espacio=true;
  43.                     if(c==10)// salto de linea          
  44.                         finlinea=true;
  45.                     else
  46.                     {
  47.                         //SI TODAVIA NO HEMOS ENCONTRADO EL ESPACIO,ES LA PRODUCCION
  48.                         if(!espacio)
  49.                         {
  50.                             prod[p]=linea[i];
  51.                             p++;
  52.                         }
  53.                         else
  54.                         {
  55.                             mod[m]=linea[i];
  56.                             m++;
  57.                         }
  58.                     }
  59.                     i++;
  60.                 }
  61.                 cout<<"Produccion: "<<prod<<endl;
  62.                 cout<<"Módulo: "<<mod<<endl;
  63.             }
  64.             else
  65.                 cout<<linea<<endl;
  66.         }
  67.         MiArchivo.close();
  68.     }
  69.     else
  70.         printf ("No se pudo abrir el archivo.");
  71.     cin.get();
  72.     return 0;
  73. }
  #3 (permalink)  
Antiguo 12/07/2011, 20:35
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Error al leer el fichero txt

Dos cosas: paracoccidio que corregiste???

Segunda tu problema recide en que no le agregas el fin de cadena a prod y mod. Despues a demas tenias otro problemitas. Asi quedaria el codigo:

Código C++:
Ver original
  1. #include<iostream>
  2. #include<fstream>
  3. #include<stdio.h>
  4. #include<string.h>
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7.  
  8. using namespace std;
  9.  
  10. int main()
  11. {
  12.   int i,p,m;
  13.   float modulo;
  14.   bool espacio,finlinea=false;
  15.   char c,linea[30],prod[15],mod[15];
  16.   ifstream MiArchivo;
  17.  
  18.   //ABRIMOS EL FICHERO
  19.   MiArchivo.open("datos.txt");
  20.  
  21.   if (!MiArchivo.fail())
  22.   {
  23.     while (!MiArchivo.eof() )
  24.     {
  25.       strcpy(linea,"");
  26.       strcpy(prod,"");
  27.       strcpy(mod,"");
  28.  
  29.       //LEEMOS LA LINEA
  30.       MiArchivo.getline(linea,sizeof(linea));
  31.  
  32.       i=17;
  33.       p=0;
  34.       m=0;
  35.       finlinea= espacio  = false;
  36.  
  37.       //ESTE IF ESTÁ PARA SALTAR LINEAS QUE NO QUEREMOS PARA NADA
  38.       if(strlen(linea)>17)
  39.       {
  40.        while(i<30 && !finlinea)
  41.        {
  42.             c=linea[i];
  43.             //cout << c << endl;
  44.         if(c==' ')
  45.                          espacio=true;
  46.             else  if(c=='\n' || c == '\0')
  47.                 finlinea=true;
  48.              else
  49.                 {
  50.                          //SI TODAVIA NO HEMOS ENCONTRADO EL ESPACIO,ES LA PRODUCCION
  51.                          if(!espacio)
  52.                          {
  53.                                 prod[p]=linea[i];
  54.                                 //cout << p << " " <<prod[p] << endl;
  55.                 p++;
  56.                           }
  57.  
  58.                           else
  59.                           {
  60.                                 mod[m]=linea[i];
  61.                                 //cout << m  << " " << mod[m] << endl;
  62.                 m++;
  63.                           }
  64.                  }
  65.          i++;
  66.          }
  67.      prod[p] = 0;
  68.          mod[m] = 0;
  69.          cout<<"Produccion: "<<prod<<endl;
  70.          cout<<"Módulo: "<<mod<<endl;
  71.       }
  72.       else
  73.         cout<<linea<<endl;
  74.     }
  75.     MiArchivo.close();
  76.   }
  77.   else
  78.    printf ("No se pudo abrir el archivo.");
  79.  
  80. }

Por ejemplo, tenias la barra en el caractar nuevalinea al revez. Es esta \.
la variable espacio no estaba seteada a false para comenzar.
Buscabas el fin de linea pero nunca el '\0'

Etiquetas: fichero, txt
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 10:20.