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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Tutorial de archivos en lenguaje C. -
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 4 Ir Abajo Respuesta Imprimir
Autor Tema: Tutorial de archivos en lenguaje C. -  (Leído 15,751 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Tutorial de archivos en lenguaje C. -
« en: 26 Agosto 2016, 14:51 pm »

Hola, gente.
Estoy muy feliz porque llegue al capítulo archivos, muy esperado por mi porqué es lo que mas necesito aprender en c dado me dará la posibilidad de desarrollar algo que todavía no les puedo decir porque las 2 veces que lo hice en foros me criticaron mucho (mucha energía negativa). -
Como notaran en el menú el programa es un tanto ambicioso para ser el primero, pero de entrada quiero ir a fondo. -
La primer consulta es un segmentation fault que me da en la línea 78 y por supuesto hasta la 90 me podrían decir en que estoy fallando, créanme que consulté páginas, videos (incluso los 3 de Alberto) pero no hallo la solución . -

Errores/dudas/etc.

1 - Segmentation fault
2 - Grabar en archivo linealmente y no en renglones.
3 - Posicionarse en el último registro.  
4 - Salto de línea anticipado en el último campo.
5 - Leer/escribir
6 - Buscar
7 - Borrar
8 - Ordenar



Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct{
  5. int  orden;
  6. char nombre[50], direccion[50], ciudad[50], correo[50];
  7. char telefono[20], celular[20];
  8. char otros[200];
  9. }Recordatorio;
  10.  
  11. void limpiar( void );
  12. void menu( void );
  13. void agregar( void );
  14.  
  15. int main ( int argc, char **argv ){
  16.  
  17. menu();
  18.  
  19. return 0;
  20. }
  21.  
  22. void limpiar( void ){
  23. system("cls||clear");
  24. }
  25.  
  26. void menu( void ){
  27. int opc, ok, ch;
  28.  
  29. do{
  30. do{
  31. limpiar( );
  32. printf( "\n =============== Menu principal ===============\n"
  33. "\n 1 - Primero"
  34. "\n 2 - Ultimo"
  35. "\n 3 - Buscar"
  36. "\n 4 - Todos"
  37. "\n 5 - Agregar"
  38. "\n 6 - Modificar"
  39. "\n 7 - Borrar"
  40. "\n 8 - Finalizar\n"
  41. "\n ingrese opcion.....:" );
  42.  
  43. ok = scanf( "%d", &opc ) == 1 && opc > 0 && opc <= 8;
  44. while ((ch = getchar()) != EOF && ch != '\n');
  45. }while( !ok );
  46.  
  47.  
  48. switch ( opc ){
  49. case 1: printf( "\n Primero" );
  50. break;
  51. case 2: printf( "\n Ultimo" );
  52. break;
  53. case 3: printf( "\n Buscar" );
  54. break;
  55. case 4: printf( "\n Todos" );
  56. break;
  57. case 5: agregar( );
  58. break;
  59. case 6: printf( "\n Modificar" );
  60. break;
  61. case 7: printf( "\n Borrar" );
  62. break;
  63. }
  64. }while( opc != 8 );
  65.  
  66. }
  67.  
  68. void agregar( void ){
  69. Recordatorio *recordatorio = NULL;
  70. FILE *fptr = fopen ( "fichero.txt", "a" );
  71.  
  72. limpiar( );
  73.  
  74.    if( fptr == NULL ){  
  75. perror(" \n\n Error en la creacion/apertura del archivo" );
  76. }else{
  77. printf( "\n\n Ingrese NOMBRE completo del contacto........: " );
  78. fgets( recordatorio->nombre, 50, stdin );
  79. printf( "\n\n Ingrese DIRECCION del contacto..............: " );
  80. fgets( recordatorio->direccion, 50, stdin );
  81. printf( "\n\n Ingrese CIUDAD donde reside el contacto.....: " );
  82. fgets( recordatorio->ciudad, 50, stdin );
  83. printf( "\n\n Ingrese CORREO del contacto.................: " );
  84. fgets( recordatorio->correo, 50, stdin );
  85. printf( "\n\n Ingrese TELEFONO FIJO del contacto..........: " );
  86. fgets( recordatorio->telefono, 50, stdin );
  87. printf( "\n\n Ingrese CELULAR del contacto................: " );
  88. fgets( recordatorio->celular, 50, stdin );
  89. printf( "\n\n Ingrese OTROS DATOS (200 caracteres)........: " );
  90. fgets( recordatorio->otros, 50, stdin );
  91.  
  92.        fprintf(fptr, "%s", recordatorio->nombre);
  93.        fprintf(fptr, "%s", recordatorio->direccion);
  94.        fprintf(fptr, "%s", recordatorio->ciudad);
  95.        fprintf(fptr, "%s", recordatorio->correo);
  96.        fprintf(fptr, "%s", recordatorio->telefono);
  97.        fprintf(fptr, "%s", recordatorio->celular);
  98.        fprintf(fptr, "%s", recordatorio->otros);
  99.  
  100. fclose ( fptr );
  101. }    
  102. }
  103.  
Saludos.


« Última modificación: 15 Septiembre 2016, 01:28 am por NOB2014 » En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Tutorial de archivos en lenguaje C. -
« Respuesta #1 en: 26 Agosto 2016, 15:55 pm »

En esa función, recordatorio es un puntero a estructura, inicializado a NULL.
Nunca le asignas una estructura

Código
  1. recordatorio = (Recordatorio*)malloc(sizeof(Recordatorio));


En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Tutorial de archivos en lenguaje C. -
« Respuesta #2 en: 26 Agosto 2016, 16:07 pm »

Muchas gracias, todo correcto, te preguntaría como se podría hacer sin utilizar memoria dinámica (me parece haberlo visto) pero como voy a encerrar el código en un bucle para que se pueda ingresar los contactos que el operador desee, me viene al pelo para no tener que hacer un array de estructuras. -
Saludos. 
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Tutorial de archivos en lenguaje C. -
« Respuesta #3 en: 26 Agosto 2016, 16:11 pm »

Sin memoria dinámica, tendrías que guardar los recordatorios en un array en algún lugar, como el main, o en el ámbito global (fuera de funciones/estructuras).
Depende de lo que quieras hacer.
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Tutorial de archivos en lenguaje C. -
« Respuesta #4 en: 26 Agosto 2016, 16:15 pm »

Una buena idea para depurar el código y encontrar el error seria imprimir las direcciones y/o valores de las variables por ejemplo en tu caso:

Código
  1. fprintf("%p\n",recordatorio);

Si ya sabemos que el error esta en X linea ponemos el printf justo antes del error

Eso  os imprime la dirección a la cual esta apuntado, y si vemos que son puros 000000 sabremos que no lo hemos inicializado.

Saludos!
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Tutorial de archivos en lenguaje C. -
« Respuesta #5 en: 26 Agosto 2016, 16:28 pm »

Una buena idea para depurar el código y encontrar el error seria imprimir las direcciones y/o valores de las variables por ejemplo en tu caso:

Código
  1. fprintf("%p\n",recordatorio);

Si ya sabemos que el error esta en X linea ponemos el printf justo antes del error

Eso  os imprime la dirección a la cual esta apuntado, y si vemos que son puros 000000 sabremos que no lo hemos inicializado.

Saludos!

Ten en cuenta que para eso hay que saber que el error es un problemacon la memoria. Para cuando supones eso, ya no necesitas debuguear así xD
Y es más, es posible que simplemente no esté inicializada, lo que podría resultar en basura diferente de 0.
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Tutorial de archivos en lenguaje C. -
« Respuesta #6 en: 26 Agosto 2016, 16:41 pm »

Tienes toda la razon mi estimado :)  ;-)
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Tutorial de archivos en lenguaje C. -
« Respuesta #7 en: 26 Agosto 2016, 18:06 pm »

Hola y muchas gracias a los dos.
Segunda pregunta, en la imagen se muestra como el programa guarda en un archivo (en primer lugar), pero lo que quiero es que se grabe en forma lineal, como yo lo puse a mano. -  

2 - Grabar en archivo linealmente y no en renglones.



Saludos.
« Última modificación: 27 Agosto 2016, 13:25 pm por NOB2014 » En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Tutorial de archivos en lenguaje C. -
« Respuesta #8 en: 26 Agosto 2016, 18:18 pm »

El primer paso seria sanitizar la entrada (Limpiarla) y quitarle el \n del fin de linea para que no de el enter.

El segundo paso si lo quieres asi en forma Lineal es determinar como saber cuando empieza y termina cada registro. Se puede hacer de 2 formas,

Forma variable (Seperando con ',' o ';' o '.' o cual quier otro valor)
Forma estatica (Guardar una cantidad determinada de bytes en el archivo, rellenando los bytes restantes con valore NULL '\0')

Saludos!
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Tutorial de archivos en lenguaje C. -
« Respuesta #9 en: 26 Agosto 2016, 18:26 pm »

¿Seria algo como esto?
Código
  1. fgets( recordatorio->nombre, 50, stdin );
  2.  
luego contar la cantidad de caracteres +1 y remplazar el '\0' por '|', por ej.
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Páginas: [1] 2 3 4 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines