• Miércoles 6 de Noviembre de 2024, 17:24

Autor Tema:  Manejo de archivos....  (Leído 2310 veces)

AnimaSubtilis

  • Miembro MUY activo
  • ***
  • Mensajes: 172
  • Nacionalidad: co
    • Ver Perfil
Manejo de archivos....
« en: Miércoles 1 de Octubre de 2008, 18:14 »
0
Hola a todos los del foro...

en estos momentos me encuentro realizando una prueba con archivos

la idea es coger un archivo que se llama estudiante.txt este es el codigo...

Código: Text
  1. void leer(struct estudiante *p)
  2. {
  3.  FILE *ptr;
  4.  char temp[20],c;
  5.  int ctr=0,nc=0,aux=0;
  6.  
  7.  if ((ptr= fopen("estudiante.txt","r+"))==NULL)
  8.   cout<<"No se puede abrir el archivo"<<endl;
  9.  else    
  10.  {
  11.   p->cima=0;      
  12.   while((c=getc(ptr))!=EOF)  // el getc es para leer caracter por caracter
  13.   {                          
  14.    if(c!=9 && c!='n') // busca fin de linea o tab
  15.    {
  16.     temp[aux]=c; // realiza la captura de los caracteres e incrementa
  17.     aux++;
  18.    }                          
  19.    if(c==9)
  20.    {
  21.     if(ctr==0) strcpy(p->nombre[p->cima],temp); // copia el contenido de temp (todos los valores de c) a depor.nombre
  22.     if(ctr==1) p->codigo[p->cima]=atoi(temp); // conversion de char a int "toi"
  23.     if(ctr==2) strcpy(p->sexo[p->cima],temp);
  24.     if(ctr==3) strcpy(p->ciudad[p->cima],temp);
  25.     //if(ctr==4)
  26.     strcpy(temp,"                                  "); // como borrar el contenido de una variable char?
  27.    
  28.     aux=0;    
  29.     ctr++;
  30.    }
  31.    if(c=='n')
  32.    {    
  33.     p->promedio[p->cima]=atoi(temp);
  34.     p->cima++;
  35.     ctr=0;
  36.     strcpy(temp,"                                  ");    
  37.    }
  38.   }
  39.  }  
  40.  fclose(ptr);
  41. }
  42.  
  43.  

el p=tab lo utilizo para separar variables y el 'n' para salto de linea...

esta es la estructura

Código: Text
  1.  
  2. struct estudiante
  3. {
  4.  int codigo[tam],promedio[tam];      
  5.  char nombre[tam][40];
  6.  char sexo[tam][40];
  7.  char ciudad[tam][40];
  8.  int cima;
  9. };
  10.  

el error que sale, mejor dicho sale un aviso de windows y me saca de una..la verdad no se que sera porque hago otra cosa en vez de utilizar un apuntador
utilizo una estructura como esto est.nombre y no me sale..

cualquier comentario sera de gran ayuda..

gracias de antemano
A menudo unas pocas horas de «prueba y ensayo» podrán ahorrarte minutos de leer manuales.
[size=150]
Dios nos Otorgo el uno y el cero....y con eso creamos un universo....[/size]

[size=109]↑°°°°ÄNÍMÄ §ÛBTÍLͧ°°°°↓[/size]


ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Manejo de archivos....
« Respuesta #1 en: Miércoles 1 de Octubre de 2008, 20:29 »
0
Probe tu codigo, y el error viene de dos partes:
1. Cuando terminas de leer la cadena en la variable temp, no añades el nulo al final de la cadena para indicar que es el fin. En C, todas las cadenas deben terminar con nulo.

2. Cuando "vacias" la variable temp, estas escribiendo mas caracteres que la longitud de la cadena, yo conte 34 espacios, y si añades el nulo, se hacen 35, temp solo tiene espacio para guardar 20, entonces al hacerlo, sobrescribes las variables, entre ellas, el apuntador de archivo. En este caso la solucion es hacer mas grande el valor de temp, o vaciar la cadena con "" (cadena vacia), y ademas, de preferencia utiliza strncpy en lugar de strcpy, que no permite que copies mas caracteres de los que le digas.

Entonces, basicamente, los cambios serian:

Código: C
  1.  
  2.             if(c==9)
  3.             {
  4.                 // Añades el fin de cadena (nulo) a tu cadena.
  5.                 temp[aux] = '';
  6.                 // copia el contenido de temp (todos los valores de c) a depor.nombre
  7.                 if(ctr==0) strcpy(p->nombre[p->cima],temp);
  8.  
  9.  

Código: C
  1.  
  2.                 //utiliza lo de abajo en lugar de strcpy(temp,"                                  ");
  3.                 // Tambien puedes utilizas strcpy(temp, "") si lo prefieres pero no lo recomiendo
  4.                 strncpy(temp,"", 20);
  5.  
  6.  

Saludos :hola:

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

Rombus

  • Miembro MUY activo
  • ***
  • Mensajes: 105
  • Nacionalidad: ar
    • Ver Perfil
    • http://myspace.com/punkrecycle
Re: Manejo de archivos....
« Respuesta #2 en: Miércoles 1 de Octubre de 2008, 20:31 »
0
Hola amigo..

a simple vista no le encontre ningun error.. cuando tenga unos minutos mas, lo releo y veo si te puedo ayudar.

igual vi que tenias un comentario que decia como limpio una variable char.. algo asi

y yo justo hice una funcion para eso que capaz te es util, es la siguiente:

Código: Text
  1. void limpiaString(char *a, int length){
  2.     int i;
  3.     for(i=0; i < length; i++)
  4.         a[i] = '';
  5. }
  6.  

es muy basica... pero bueno... puede ser util :)

entonces en vez de hacer
Código: Text
  1. strcpy(temp,"                                  "); // como borrar el contenido de una variable char?
  2.  

podrias hacer
Código: Text
  1. limpiaString(temp,20)
  2.  

20 es el largo de tu arreglo de chars

y el tab capaz es mas facil de recordar poniendo un 't' en vez de un 9

ahora me tengo q ir


despues le pego un ojo mas a fondo


saludos!

Rombus

  • Miembro MUY activo
  • ***
  • Mensajes: 105
  • Nacionalidad: ar
    • Ver Perfil
    • http://myspace.com/punkrecycle
Re: Manejo de archivos....
« Respuesta #3 en: Miércoles 1 de Octubre de 2008, 20:34 »
0
Cita de: "ProfesorX"
Código: C
  1.  
  2.                 //utiliza lo de abajo en lugar de strcpy(temp,"                                  ");
  3.                 // Tambien puedes utilizas strcpy(temp, "") si lo prefieres pero no lo recomiendo
  4.                 strncpy(temp,"", 20);
  5.  
  6.  


:o strncpy(temp,"", 20);

¿esa funcion pasa todos los valores de temp a '' ?

bastante util, jeje, y yo haciendo la funcion.

con respecto a usar el strcpy... yo tampoco lo recomiendo... pensaba que haciendo un strcpy(temp,"") se pasaba toda la cadena a pero no lo es.. por lo que te queda basura entre medio... es por eso que termine haciendo la funcion limpiaString

saludos!

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Manejo de archivos....
« Respuesta #4 en: Miércoles 1 de Octubre de 2008, 20:53 »
0
Cita de: "Rombus"
:o strncpy(temp,"", 20);

¿esa funcion pasa todos los valores de temp a '' ?

Si, siempre y cuando sea una cadena nula, lo que hace es que copia n caracteres, y si no se acompleta, lo rellena con null.

Tambien se puede hacer con memset, esta funcion es buena, porque es mas general, permite poner a cero variables de cualquier tipo, no solo char.

Código: Text
  1.  
  2.     int vector[30];
  3.     memset(&vector, 0, sizeof(vector));
  4.  
  5.  

Solo hay que tener cuidado con el tercer parametro, que es la cantidad de bytes a borrar, porque si especificas una cantidad mayor, igual puedes borrar partes de la memoria que no desees ;)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

AnimaSubtilis

  • Miembro MUY activo
  • ***
  • Mensajes: 172
  • Nacionalidad: co
    • Ver Perfil
Re: Manejo de archivos....
« Respuesta #5 en: Miércoles 1 de Octubre de 2008, 21:32 »
0
Hiii

gracias por todos los aportes...cambie lo de temp y si es muy cierto :P  se me habia pasado..

pero imaginence que me daba lo mismo se medio por cambiar de cambiar esto

Código: Text
  1. if(ctr==0) strcpy(p->nombre[p->cima],temp);
  2.  

por esto

Código: Text
  1. if(ctr==0) strcpy(p->nombre[nc],temp);
  2.  

a mi parecer el p->cima se pierde.....

ya logro capturar bien los datos excepto el nombre no me bota nada...no se porque...

gracias de antemano....voy a cacharrearle haber que pasa

taluego....
A menudo unas pocas horas de «prueba y ensayo» podrán ahorrarte minutos de leer manuales.
[size=150]
Dios nos Otorgo el uno y el cero....y con eso creamos un universo....[/size]

[size=109]↑°°°°ÄNÍMÄ §ÛBTÍLͧ°°°°↓[/size]


Rombus

  • Miembro MUY activo
  • ***
  • Mensajes: 105
  • Nacionalidad: ar
    • Ver Perfil
    • http://myspace.com/punkrecycle
Re: Manejo de archivos....
« Respuesta #6 en: Miércoles 1 de Octubre de 2008, 21:37 »
0
uhh

excelente!, gracias por el dato, estas cosas asi son re valorables

 :beer:

AnimaSubtilis

  • Miembro MUY activo
  • ***
  • Mensajes: 172
  • Nacionalidad: co
    • Ver Perfil
Re: Manejo de archivos....
« Respuesta #7 en: Miércoles 1 de Octubre de 2008, 22:28 »
0
Le doy y le doy y no entiendo

Código: Text
  1. void leer(struct estudiante *p)
  2. {
  3.  FILE *ptr;
  4.  char temp[30],c;
  5.  int ctr=0,nc=0,aux=0;
  6.  
  7.  if ((ptr= fopen("estudiante.txt","r+"))==NULL)
  8.   cout<<"No se puede abrir el archivo"<<endl;
  9.  else    
  10.  {
  11.   //p->cima=0;      
  12.   while((c=getc(ptr))!=EOF)  // el getc es para leer caracter por caracter
  13.   {                  
  14.    //Sleep(10);                          
  15.    if(c!=9 && c!='n') // busca fin de linea o tab
  16.    {
  17.     temp[aux]=c; // realiza la captura de los caracteres e incrementa
  18.     aux++;
  19.    }                          
  20.    if(c==9)
  21.    {
  22.     temp[aux] = '';      
  23.     if(ctr==0)
  24.     {
  25.      
  26.      strcpy(p->nombre[nc],temp);
  27.      cout<<temp<<"  "<<c<<"  "<<p->nombre[nc]<<endl;        
  28.     }
  29.     if(ctr==1) p->codigo[nc]=atoi(temp); // conversion de char a int "toi"
  30.     if(ctr==2) strcpy(p->sexo[nc],temp);
  31.     if(ctr==3) strcpy(p->ciudad[nc],temp);
  32.     //if(ctr==4) p->promedio[nc]=atoi(temp);
  33.    
  34.    // strncpy(temp,"",30); // como borrar el contenido de una variable char?
  35.     memset(&temp, 0, sizeof(temp));
  36.    
  37.     aux=0;    
  38.     ctr++;
  39.    }
  40.    if(c=='n')
  41.    {    
  42.     temp[aux] = '';    
  43.     //strcpy(p->nombre[nc],temp);
  44.     //p->cima++;
  45.     p->promedio[nc]=atoi(temp);
  46.     //strncpy(temp,"",30);    
  47.     memset(&temp, 0, sizeof(temp));
  48.     nc++;
  49.     ctr=0;    
  50.    }
  51.   }
  52.  }  
  53.  fclose(ptr);
  54.  system("pause");
  55.  system("CLS");
  56. }
  57.  

todos los valores los toma menos los nombres...
 :wacko:
cada vez que leo el nombre muestro temp y p->nombre y la primera iteracion sale lo leido las demas no
pero despues aparece que no estan  :brickwall:   :hitcomp:  no se  

cualquier comentario sera bien recibido....

teluego.....
A menudo unas pocas horas de «prueba y ensayo» podrán ahorrarte minutos de leer manuales.
[size=150]
Dios nos Otorgo el uno y el cero....y con eso creamos un universo....[/size]

[size=109]↑°°°°ÄNÍMÄ §ÛBTÍLͧ°°°°↓[/size]


ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Manejo de archivos....
« Respuesta #8 en: Jueves 2 de Octubre de 2008, 01:38 »
0
Creo que tienes que hacer aux = 0 cuando c == 'n', igual que como lo haces cuando c == 't' (tabulador) al final de tu if.

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

AnimaSubtilis

  • Miembro MUY activo
  • ***
  • Mensajes: 172
  • Nacionalidad: co
    • Ver Perfil
Re: Manejo de archivos....
« Respuesta #9 en: Jueves 2 de Octubre de 2008, 15:41 »
0
Gracias ProfesorX me ha sido muy util sus comentarios...

creo que tengo que ser mas cuidadoso la proxima :P ....

mire que ya me salen todas las variables solo me falta el nombre de la primera iteracion.....voy a mirarlo haber que pasa

de nuevo mil gracias por sus aportes..

taluego....
A menudo unas pocas horas de «prueba y ensayo» podrán ahorrarte minutos de leer manuales.
[size=150]
Dios nos Otorgo el uno y el cero....y con eso creamos un universo....[/size]

[size=109]↑°°°°ÄNÍMÄ §ÛBTÍLͧ°°°°↓[/size]


AnimaSubtilis

  • Miembro MUY activo
  • ***
  • Mensajes: 172
  • Nacionalidad: co
    • Ver Perfil
Re: Manejo de archivos....
« Respuesta #10 en: Jueves 2 de Octubre de 2008, 15:48 »
0
Listo ya solucione el ultimo problema....

 :P claro fue de una forma poco bonita pero en este momento me interesa el resultado sobre todo... quedo algo asi

Código: Text
  1. void leer(struct estudiante *p)
  2. {
  3.  FILE *ptr;
  4.  char temp[30],c,pal[30];
  5.  int ctr=0,nc=0,aux=0;
  6.  
  7.  if ((ptr= fopen("estudiante.txt","r+"))==NULL)
  8.   cout<<"No se puede abrir el archivo"<<endl;
  9.  else    
  10.  {
  11.   //p->cima=0;      
  12.   while((c=getc(ptr))!=EOF)  // el getc es para leer caracter por caracter
  13.   {                        
  14.    if(c=='t')
  15.    {
  16.     temp[aux] = '';    
  17.     if(nc==0 && ctr==0) strcpy(pal,temp);//machetaso al maximo  
  18.     if(ctr==0) strcpy(p->nombre[nc],temp);
  19.     if(ctr==1) p->codigo[nc]=atoi(temp); // conversion de char a int "toi"
  20.     if(ctr==2) strcpy(p->sexo[nc],temp);
  21.     if(ctr==3) strcpy(p->ciudad[nc],temp);    
  22.     memset(&temp, 0, sizeof(temp));    
  23.     aux=0;    
  24.     ctr++;
  25.    }
  26.    if(c=='n')
  27.    {    
  28.     temp[aux] = '';        
  29.     p->promedio[nc]=atoi(temp);    
  30.     memset(&temp, 0, sizeof(temp));
  31.     nc++;
  32.     aux=0;
  33.     ctr=0;    
  34.    }
  35.    if(c!='t' && c!='n') // busca fin de linea o tab
  36.    {
  37.     temp[aux]=c; // realiza la captura de los caracteres e incrementa
  38.     aux++;
  39.    }                          
  40.   }
  41.  }  
  42.  fclose(ptr);
  43.  strcpy(p->nombre[0],pal);
  44. }
  45.  

bueno espero que este codigo pueda servirle a alguien en un futuro...gracias por todo la colaboracion prestada...

teluego.....
A menudo unas pocas horas de «prueba y ensayo» podrán ahorrarte minutos de leer manuales.
[size=150]
Dios nos Otorgo el uno y el cero....y con eso creamos un universo....[/size]

[size=109]↑°°°°ÄNÍMÄ §ÛBTÍLͧ°°°°↓[/size]