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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


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

Desconectado Desconectado

Mensajes: 147



Ver Perfil
[C] - Manipulación de archivos binarios
« en: 12 Julio 2010, 23:10 pm »

Hola, estaba practicando con archivos binarios, y tal vez a alguien le pueda servir este source, me hace falta la actualización de datos, pero no es algo difícil.

Ahora bien, lo que no sé si es correcto, es la forma en que yo borro al archivo  :-\ ya que tengo que hacer una llamada al sistema.

Código
  1. /** Programa para manipular estructuras
  2. junto con archivos tipo binarios.
  3. El menu contiene un AB para el arc
  4. hivo no indexado.
  5. **/
  6. /* Autor: cbug
  7.         Fecha: 11 de Julio de 2010
  8. */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. /** DEFINICION DE TIPOS DE DATOS **/
  13. typedef struct Fecha{
  14. int dia;
  15. int mes;
  16. int anio;
  17. }stFecha;
  18.  
  19. typedef struct Persona{
  20. char Nombre[25];
  21. stFecha Nacimiento;
  22. }stPersona;
  23.  
  24. /**********************************/
  25.  
  26. /** PROTOTIPOS DE FUNCIONES **/
  27. void Ingreso(stPersona *P);
  28. void Muestra(stPersona);
  29.  
  30. void Archivo_Escribe(stPersona *P);
  31. long Archivo_Busca_Persona(char *nombre);
  32. void Archivo_Elimina(void);
  33. void Archivo_Muestra(void);
  34. void Archivo_Borrar(void);
  35.  
  36. stPersona Persona_Blanco(void);
  37.  
  38. void Menu(void);
  39. void ClrBuffer(void);
  40. /*****************************/
  41.  
  42. int main(void)
  43. {
  44. //Variables Locales
  45. int _opt;
  46. stPersona _persona;
  47. Menu();
  48. printf("Ingrese opcion>");
  49. scanf("%d", &_opt);
  50. ClrBuffer();
  51. while(_opt != 0)
  52. {
  53. switch(_opt)
  54. {
  55. case 1:
  56. Ingreso(&_persona);
  57. break;
  58. case 2:
  59. Muestra(_persona);
  60. break;
  61. case 3:
  62. Archivo_Escribe(&_persona);
  63. break;
  64. case 4:
  65. Archivo_Muestra();
  66. break;
  67. case 5:
  68. Archivo_Elimina();
  69. break;
  70. case 6:
  71. Archivo_Borrar();
  72. break;
  73. default:
  74. break;
  75. }
  76. Menu();
  77. printf("\nIngrese opcion>");
  78. scanf("%d", &_opt);
  79. ClrBuffer();
  80. }
  81. return 0;
  82. }
  83.  
  84. void ClrBuffer(void)
  85. {
  86. while(getchar() != '\n');
  87. }
  88.  
  89. void Menu(void)
  90. {
  91. puts("************MENU************");
  92. puts("1 - Ingreso de datos persona");
  93. puts("2 - Muestra de datos persona");
  94. puts("3 - Escribir en personas.dat");
  95. puts("4 - Mostrar arc personas.dat");
  96. puts("5 - Eliminar en personas.dat");
  97. puts("6 - Borrar a pf personas.dat");
  98. puts("0 - Salir");
  99. puts("****************************");
  100. }
  101.  
  102. void Ingreso(stPersona *P)
  103. {
  104. puts("\n\tIngreso de informacion");
  105. printf("Ingrese nombre>");
  106. fgets(P->Nombre, sizeof(char) * 25, stdin);
  107. puts("\t Ingreso Fecha Nacimiento");
  108. printf("Ingrese dia>");
  109. scanf("%d", &P->Nacimiento.dia);
  110. ClrBuffer();
  111. printf("Ingrese mes>");
  112. scanf("%d", &P->Nacimiento.mes);
  113. ClrBuffer();
  114. printf("Ingrese año>");
  115. scanf("%d", &P->Nacimiento.anio);
  116. ClrBuffer();
  117. puts("\n\t FINALIZADO EL INGRESO");
  118. }
  119.  
  120. void Muestra(stPersona P)
  121. {
  122. printf("\nNombre: %s\n", P.Nombre);
  123. printf("\nFecha Nacimiento: %d/%d/%d\n", P.Nacimiento.dia, P.Nacimiento.mes, P.Nacimiento.anio);
  124. }
  125.  
  126. stPersona Persona_Blanco(void)
  127. {
  128. stPersona aux;
  129. strcpy(aux.Nombre, " ");
  130. aux.Nacimiento.dia = 0;
  131. aux.Nacimiento.mes = 0;
  132. aux.Nacimiento.año = 0;
  133.        return aux;
  134. }
  135.  
  136. void Archivo_Escribe(stPersona *P)
  137. {
  138. FILE *pf;
  139. pf = fopen("personas.dat", "ab"); // Abre un archivo para agregar personas
  140. if(pf == NULL)
  141. pf = fopen("personas.dat", "wb"); // Si no existe creamos uno nuevo
  142. fwrite(P, sizeof(stPersona), 1, pf);
  143. fclose(pf);
  144. }
  145.  
  146. void Archivo_Muestra(void)
  147. {
  148. FILE *pf;
  149. stPersona *_pbuffer = NULL;
  150. pf = fopen("personas.dat", "rb");
  151. if(pf == NULL)
  152. puts("Error al intentar abrir el archivo personas.dat");
  153. else
  154. {
  155. while(!feof(pf))
  156. {
  157. _pbuffer = (stPersona *)(malloc(sizeof(stPersona)));
  158. fread(_pbuffer, sizeof(stPersona), 1, pf);
  159. if(_pbuffer)
  160. Muestra(*_pbuffer);
  161. }
  162. free(_pbuffer);// Se debe liberar el ultimo bloque leido
  163. fclose(pf);
  164. }
  165. }
  166.  
  167. long Archivo_Busca_Persona(char *nombre)
  168. {
  169. FILE *pf;
  170. stPersona *_pbuffer = NULL;
  171. int counter = 0;
  172. pf = fopen("personas.dat", "rb");
  173. if(pf == NULL)
  174. puts("Error al intentar abrir el archivo personas.dat");
  175. else
  176. {
  177. while(!feof(pf))
  178. {
  179. _pbuffer = (stPersona *)(malloc(sizeof(stPersona)));
  180. fread(_pbuffer, sizeof(stPersona), 1, pf);
  181. if(strcmp(_pbuffer->Nombre, nombre) == 0)
  182. return counter;
  183. counter++;
  184. }
  185. free(_pbuffer);
  186. fclose(pf);
  187. return -1;
  188. }
  189. }
  190.  
  191.  
  192. void Archivo_Elimina(void)
  193. {
  194. char Nombre[25];
  195. long Pos;
  196. stPersona P;
  197. FILE *pf;
  198. printf("\nIngrese Nombre de Persona>");
  199. fgets(Nombre, sizeof(char) * 25, stdin);
  200. Pos = Archivo_Busca_Persona(Nombre);
  201. if(Pos > -1)
  202. {
  203. pf = fopen("personas.dat", "wb");
  204. fseek(pf, Pos * sizeof(stPersona), 0);
  205. P = Persona_Blanco();
  206. fwrite(&P, sizeof(stPersona), 1, pf);
  207. fclose(pf);
  208. }
  209. else
  210. puts("No se encuentra");
  211. }
  212.  
  213. void Archivo_Borrar(void)
  214. {
  215. system("rm personas.dat");
  216. }


« Última modificación: 15 Julio 2010, 04:55 am por cbug » En línea

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

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: [C] - Manipulación de archivos binarios
« Respuesta #1 en: 12 Julio 2010, 23:24 pm »

Podes usar o bien remove, o funciones especificas del sistema (como WINAPI en Windows), o librerías multi-plataforma que tengan funciones de manejo de archivos (Como boost, por ejemplo)

Saludos.



En línea

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

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: [C] - Manipulación de archivos binarios
« Respuesta #2 en: 12 Julio 2010, 23:28 pm »

Gracias, que raro, capaz que no busqué bien en mi libro  :-\
En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: [C] - Manipulación de archivos binarios
« Respuesta #3 en: 13 Julio 2010, 09:42 am »

Código
  1. int año;
-No deberías usar la ñ para nombres de variables.

-La variable _pos se queda sin utilizar.

-Esto debiera ser una función void():

Código
  1. tPersona Persona_Blanco(void)
  2. {
  3. stPersona aux;
  4. strcpy(aux.Nombre, " ");
  5. aux.Nacimiento.dia = 0;
  6. aux.Nacimiento.mes = 0;
  7. aux.Nacimiento.ano = 0;
  8. }

Código
  1. P = Persona_Blanco();

Pero en la función no retornas nada.


Saludos.
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
cbug

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: [C] - Manipulación de archivos binarios
« Respuesta #4 en: 14 Julio 2010, 03:01 am »

 :-\ Al parecer no copié el source correcto  :o

1- Lo de "año", sinceramente no sé porque aquí se puso "ñ" en ves de "ni"
2- Lo demás es por no haber copiado bien el source correcto :P
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
archivos binarios
Programación C/C++
marcico 0 1,638 Último mensaje 26 Julio 2012, 14:14 pm
por marcico
[?] Archivos Binarios
Programación C/C++
MeCraniDOS 3 3,006 Último mensaje 20 Octubre 2013, 15:05 pm
por rir3760
Manipulación de archivos
Programación C/C++
Lotux5 2 2,172 Último mensaje 23 Noviembre 2013, 17:59 pm
por Lotux5
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines