elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Manejo de Archivos duda!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Manejo de Archivos duda!  (Leído 9,245 veces)
Mr.Blue


Desconectado Desconectado

Mensajes: 441



Ver Perfil WWW
Manejo de Archivos duda!
« en: 4 Mayo 2010, 04:31 am »

Bueno les comento, tengo una duda al usar archivos,  mi idea es generar un archivo y que en este se puedan intresar datos el tema es que cada ves que se ingresan nuevos datos los datos anteriores se borran reemplazandolos por los nuevos datos, como puedo hacer para q esto no pase? osea que mantenga estos datos y en un renglon aparte escriba estos nuevos datos.

Otra pregunta tmb que me esta pasando es que al guardar estos datos ademas de la imformacion que ingreso tambien se guardan caracteres que no fueron ingresados como por ejemplo, letras o simbolos %, $ no se si es porq faltaria limpiar algo o no,
en mi ejercicio de ejemplo utilizo una structura la cual contine cadenas de caracteres y a estas las ingreso todo con gets, ya q no puedo  usar printf ya que le una palabra en ves de una palabra.

Código
  1.  
  2. struct datos {
  3. char nombre [15];// nombre del usuario
  4. char pass [6];//password del usuario
  5. int main()
  6. datos regin;
  7. FILE *fichero;
  8. FILE *pf; // apunta al archivo
  9.  
  10.  
  11. pf=fopen ("C:\\users.txt","wb");
  12.  
  13. if (pf==NULL)
  14.  {
  15. printf ("ERROR DE LECTURA");
  16. getch();
  17. exit(1);
  18.  }
  19.  
  20.  while (i!=0) {
  21.  
  22. printf ("\nINGRESE NOMBRE DE USUARIO:");
  23. gets (regin.nombre);
  24.  
  25. printf ("\nINGRESE PASSWORD:");
  26. gets (regin.pass);
  27.  

una parrte del codigo en donde se muestra la structura, la apertura del archivo el ingreso de datos por si es de ayuda.


En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Manejo de Archivos duda!
« Respuesta #1 en: 4 Mayo 2010, 04:35 am »

Abrí el archivo en modo a (Append)

Saludos


En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
Mr.Blue


Desconectado Desconectado

Mensajes: 441



Ver Perfil WWW
Re: Manejo de Archivos duda!
« Respuesta #2 en: 4 Mayo 2010, 05:30 am »

ajam ahi ta arreglado gracias
y por el tema de que los datos entrancon basura?
En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Manejo de Archivos duda!
« Respuesta #3 en: 4 Mayo 2010, 05:49 am »

Ni idea porque no se como estas implementando los ciclos, las lecturas, las escrituras, ni los tipos de datos. El código que pusiste fue de ejemplo (y por cierto con algunos errores) y no indica lo suficiente como para responderte eso.
Pone el código completo y lo vemos (pero si es demasiado largo, prueba depurandolo vos mismo)

Saludos!
En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
taul

Desconectado Desconectado

Mensajes: 90


Ver Perfil
Re: Manejo de Archivos duda!
« Respuesta #4 en: 4 Mayo 2010, 08:03 am »

mmm el code esta bastante mal escrito..pero te felicito por empezar con C es lo mas grande q hay "para mi"

algo asi estaria mejor escrito:

Código:
#include <stdio.h>
#include <stdlib.h>

struct datos { //extructura
char nombre [15];// nombre del usuario
char pass [6];//password del usuario
}regin;

int i=0;

int main(){
FILE *pf;
 
pf = fopen("C:\\users.txt","ab");
 
  if (pf==NULL){
     printf ("ERROR DE LECTURA");
     exit(1);
  }
 
    do{
 
       printf("\nINGRESE NOMBRE DE USUARIO:");
       scanf("%s",&regin.nombre);
 
       printf("\nINGRESE PASSWORD:");
       scanf("%s",&regin.pass);
       
        if(strlen(regin.nombre)>14 || strlen(regin.pass)>5){ //evitamos un overflow
            system("clear");
            printf("Nombre o Password muy largos\n");
            sleep(2);
            system("clear");
         }
           else{
           fprintf(pf,"usuario: %s\npass: %s\n\n",regin.nombre,regin.pass); /*escribimos en el archivo*/
           fclose(pf);  //y lo cerramos
           i++;
           }
           
         

    }while (i==0);
system("clear");
printf("usuario Registrado\n");
}



Saludos...Taul.
En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Manejo de Archivos duda!
« Respuesta #5 en: 4 Mayo 2010, 08:46 am »

Esa no es la mejor manera de evitar un overflow ya que por mas que lo chequees luego, el overflow sucede igual. En todo caso debería usar fgets para leer las cadenas o especificar la cantidad de caracteres en scanf. De cualquier manera es mejor utilizar fgets ya que la cantidad a leer se indica en los argumentos, lo cual es obviamente una ventaja.

Por otro lado, si utilizas estructuras y abrís el archivo en modo binario, es conveniente trabajarlo de esa forma (fwrite, fread, por ejemplo).

En cuanto al scanf, no debes utilizar el ampersand con cadenas. Seguramente en ese caso no de error, pero si lo daría si la memoria del array es reservada en forma dinámica.

Y como ultimo, las variables globales deben evitarse en la medida de lo posible (Lo cual aplica en el 99.9% de las veces)

Saludos!
En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
misterharry

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Manejo de Archivos duda!
« Respuesta #6 en: 4 Mayo 2010, 08:46 am »

        if(strlen(regin.nombre)>14 || strlen(regin.pass)>5){ //evitamos un overflow
            system("clear");
            printf("Nombre o Password muy largos\n");
            sleep(2);
            system("clear");
         }

disculpa, pero que hace exactamente la funcion strlen()???
y sleep() en que libreria esta??? esta disponible para linux???
hago muchas preguntas??? XD
gracias por todas las ayudas
 ^^
En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Manejo de Archivos duda!
« Respuesta #7 en: 4 Mayo 2010, 08:56 am »

strlen
sleep

En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
taul

Desconectado Desconectado

Mensajes: 90


Ver Perfil
Re: Manejo de Archivos duda!
« Respuesta #8 en: 4 Mayo 2010, 09:03 am »

si tenes razon se provoca el overflow igual...bueno che lo escribi al bardo recien.

seria mejor un

scanf("%14s",&regin.nombre);

tomaria solo los 14 primeros char...

con respecto al ab...puedes trabajarlo perfectamente con fprintf...acordate q no lo estamos leyendo simplemente escribimos en el.para poder utilizar fwrite..deberias crear un buffer+añadir todo a un buffer+escribir el buffer en el archivo esto es = a desperdiciar memoria al vicio.

si debes declarar dentro de main tiene razon Littlehorse..aparte te ahorara dolores de cabezas el dia de mañana.

misterharry strlen debuelve un valor int el cual contine la cantidad de caracteres q contiene un buffer....y sleep no me acuerdo pero creo q en stdio.h...si esta disponible para linux al igual que todas las func de la lib standar...en windows en vez de ingresar segundos debes ingresar ms.


saludos.
« Última modificación: 4 Mayo 2010, 09:05 am por taul » En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Manejo de Archivos duda!
« Respuesta #9 en: 4 Mayo 2010, 09:12 am »

Ya se que se puede usar fprintf, pero en el caso de tratar el archivo en modo binario y estar utilizando estructuras, es preferible trabajarlo de esa forma.

Si vos guardas un nombre (15 caracteres, 15 bytes) mas un password (6 caracteres, 6 bytes) es exactamente lo mismo que guardar la estructura entera (21 bytes) con la diferencia que guardando la estructura no estas limitado estrictamente al acceso secuencial del archivo.

PD: sleep no es estándar.

Saludos!
« Última modificación: 4 Mayo 2010, 09:16 am por Littlehorse » En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Manejo de Archivos - PROBLEMA!!!
Programación C/C++
clodan 3 2,783 Último mensaje 14 Octubre 2010, 18:34 pm
por Horricreu
manejo de archivos en C++
Programación C/C++
mauroooooooo 1 2,982 Último mensaje 19 Abril 2012, 03:45 am
por Beakman
Duda sobre manejo de archivos
Programación C/C++
xogeid46 3 2,097 Último mensaje 19 Enero 2013, 05:48 am
por apuromafo CLS
manejo de archivos txt
Programación C/C++
flony 3 2,539 Último mensaje 12 Febrero 2013, 22:40 pm
por flony
Duda Manejo De Archivos De Acceso Aleatorio
Programación C/C++
Omar_2013 2 2,248 Último mensaje 1 Abril 2014, 20:22 pm
por Omar_2013
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines