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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Problema con archivos de acceso directo
« en: 7 Junio 2011, 23:48 pm »

He estado intentando crear un programa que simule una base de datos utilizando un archivo de acceso directo. Sin embargo, me han surgido unos cuantos problemas con el código:
-No reconoce si el archivo está vacío para comunicárselo al usuario.
-Muestra dos veces las cuentas creadas, en lugar de una.
-No borra las cuentas (que en realidad lo que se hace, en lugar de borrar texto, sustituir este por un "usuario vacio" que se ignora y no es mostrado).

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct fichaCliente { // tamaño: 68 bits
  5. int cuenta;
  6. char nombre[15], apellidos[45];
  7. float dinero;
  8. } cliente, clienteVacio = {0, "", "", 0.0};
  9.  
  10. short numero_cuentas = 0;
  11.  
  12. void mostrarClientes(FILE *);
  13. void editarCliente(FILE *);
  14. void crearCliente(FILE *);
  15. void eliminarCliente(FILE *);
  16. void comprobarCantidad(FILE *);
  17. void asistenteCreacionCliente(int);
  18.  
  19. int main() {
  20. int opcion;
  21. FILE *basedatos;
  22.  
  23. if (!(basedatos = fopen("base_de_datos.dat", "a+"))) perror("No se ha podido abrir el fichero.\n");
  24. else {
  25. do {
  26. printf("%s\n%s\n%s\n%s\n%s\n%s\n", "¿Que desea hacer?", "1. Mostrar todos los clientes existentes y sus datos",
  27. "2. Editar algun dato de algun cliente existente", "3. Crear una cuenta para un nuevo cliente",
  28. "4. Eliminar un cliente de la lista", "5. Salir del programa");
  29.  
  30. fflush(stdin);
  31. scanf(" %i", &opcion);
  32.  
  33. rewind(basedatos);
  34. comprobarCantidad(basedatos);
  35. rewind(basedatos);
  36.  
  37. switch(opcion) {
  38. case 1:
  39. mostrarClientes(basedatos);
  40. break;
  41.  
  42. case 2:
  43. editarCliente(basedatos);
  44. break;
  45.  
  46. case 3:
  47. crearCliente(basedatos);
  48. break;
  49.  
  50. case 4:
  51. eliminarCliente(basedatos);
  52. break;
  53.  
  54. case 5:break;
  55.  
  56. default:
  57. printf("Opcion no correcta.\n");
  58. break;
  59. }
  60.  
  61. putchar('\n');
  62. } while (opcion != 5);
  63.  
  64. }
  65.  
  66. fclose(basedatos);
  67. return 0;
  68. }
  69.  
  70. void mostrarClientes(FILE *fichero) {
  71. if (feof(fichero)) {
  72. printf("Error: el fichero esta vacio.\n");
  73. return;
  74. }
  75.  
  76. printf("%-9s%-16s%-41s%s\n", "Cuenta", "Nombre", "Apellidos", "Dinero");
  77. while(!feof(fichero)) {
  78. fread(&cliente, sizeof(struct fichaCliente), 1, fichero);
  79. if (cliente.cuenta != 0) {
  80. printf("%-9i%-16s%-41s%.2f", cliente.cuenta, cliente.nombre, cliente.apellidos, cliente.dinero);
  81. putchar('\n');
  82. }
  83. }
  84. }
  85.  
  86. void editarCliente(FILE *fichero) {
  87. if (feof(fichero)) {
  88. printf("Error: el fichero esta vacio.\n");
  89. return;
  90. }
  91.  
  92. int cuenta, opcion;
  93. float temporal;
  94.  
  95. printf("Introduzca el numero de cuenta del cliente: ");
  96. fflush(stdin);
  97. scanf(" %i", &cuenta);
  98.  
  99. if (cuenta > numero_cuentas) {
  100. printf("El cliente no existe. Cree una cuenta para el.\n");
  101. } else {
  102. fseek(fichero, sizeof(struct fichaCliente) * (cuenta-1), SEEK_SET);
  103. fread(&cliente, sizeof(struct fichaCliente), 1, SEEK_SET);
  104.  
  105. if (!strcmp(cliente.nombre, "")) printf("La cuenta %i contiene un cliente vacio.\n", cuenta);
  106. else {
  107. do {
  108. printf("Que desea modificar?\n%s\n%s\n%s\n%s\n%s\n", "1. Nombre del cliente",
  109. "2. Apellidos del cliente", "3. Dinero del cliente", "4. Añadir/quitar dinero",
  110. "5. Cancelar operacion");
  111. fflush(stdin);
  112. scanf(" %i", &opcion);
  113.  
  114. switch (opcion) {
  115. case 1:
  116. printf("Introduzca el nuevo nombre del cliente: ");
  117. fflush(stdin);
  118. scanf(" %[^\n]", cliente.nombre);
  119. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  120. break;
  121.  
  122. case 2:
  123. printf("Introduzca los nuevos apellidos del cliente: ");
  124. fflush(stdin);
  125. scanf(" %[^\n]", cliente.apellidos);
  126. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  127. break;
  128.  
  129. case 3:
  130. printf("Introduzca la cantidad actual de dinero del cliente: ");
  131. fflush(stdin);
  132. scanf(" %f", &cliente.dinero);
  133. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  134. break;
  135.  
  136. case 4:
  137. printf("Introduzca la cantidad de dinero a añadir/quitar (+/-): ");
  138. fflush(stdin);
  139. scanf(" %f", &temporal);
  140. cliente.dinero += temporal;
  141. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  142. break;
  143.  
  144. case 5:break;
  145. default:printf("Opcion invalida.\n\n");break;
  146. }
  147. } while (opcion != 5);
  148. }
  149. }
  150. }
  151.  
  152. void crearCliente(FILE *fichero) {
  153. int cuenta;
  154. short i, distancia;
  155. char respuesta;
  156.  
  157. printf("Introduzca el numero de cuenta que desea utilizar: ");
  158. fflush(stdin);
  159. scanf(" %i", &cuenta);
  160.  
  161. if(cuenta > numero_cuentas) {
  162. distancia = cuenta - numero_cuentas;
  163.  
  164. while(fgetc(fichero) != EOF);
  165.  
  166. for (i = 0; i < distancia; i++) {
  167. fwrite(&clienteVacio, sizeof(struct fichaCliente), 1, fichero);
  168. }
  169.  
  170. //fseek(fichero, sizeof(struct fichaCliente) * (cuenta-1), SEEK_SET);
  171. asistenteCreacionCliente(cuenta);
  172. cliente.cuenta = cuenta;
  173. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  174. } else {
  175. fseek(fichero, sizeof(struct fichaCliente) * (cuenta-1), SEEK_SET);
  176. fread(&cliente, sizeof(struct fichaCliente), 1, fichero);
  177.  
  178. if (cliente.cuenta == 0) {
  179. asistenteCreacionCliente(cuenta);
  180. cliente.cuenta = cuenta;
  181. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  182. } else {
  183. printf("¡El numero de cuenta ya contiene un cliente! ¿Desea continuar? (s/n) ");
  184. do {
  185. fflush(stdin);
  186. respuesta = getchar();
  187.  
  188. switch (respuesta) {
  189. case 's':
  190. asistenteCreacionCliente(cuenta);
  191. cliente.cuenta = cuenta;
  192. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  193. break;
  194. case 'n':break;
  195. default: printf("Opcion incorrecta.\n");
  196. }
  197. } while (respuesta != 'n' && respuesta != 's');
  198. }
  199. }
  200. }
  201.  
  202. void eliminarCliente(FILE *fichero) {
  203. if (feof(fichero)) {
  204. printf("Error: el fichero esta vacio.\n");
  205. return;
  206. }
  207.  
  208. int cuenta;
  209. printf("Introduzca el numero de cuenta a eliminar: ");
  210. fflush(stdin);
  211. scanf(" %i", &cuenta);
  212.  
  213. if(cuenta > numero_cuentas) {
  214. printf("Error: el cliente con el numero de cuenta %i no existe.\n", cuenta);
  215. } else {
  216. fseek(fichero, sizeof(struct fichaCliente) * (cuenta-1), SEEK_SET);
  217. fwrite(&clienteVacio, sizeof(struct fichaCliente), 1, fichero);
  218. printf("El cliente %i ha sido eliminado satisfactoriamente.\n", cuenta);
  219. }
  220. }
  221.  
  222. void comprobarCantidad(FILE *fichero) {
  223. while(!feof(fichero)) {
  224. fread(&cliente, sizeof(struct fichaCliente), 1, fichero);
  225. numero_cuentas++;
  226. }
  227. }
  228.  
  229. void asistenteCreacionCliente(int cuenta) {
  230. char correcto;
  231. do {
  232. printf("Introduzca el nombre del cliente con cuenta %i: ", cuenta);
  233. fflush(stdin);
  234. scanf(" %[^\n]", cliente.nombre);
  235.  
  236. printf("Introduzca los apellidos del cliente con cuenta %i: ", cuenta);
  237. fflush(stdin);
  238. scanf(" %[^\n]", cliente.apellidos);
  239.  
  240. printf("Introduzca la cantidad de dinero que el cliente con numero de cuenta %i posee: ", cuenta);
  241. fflush(stdin);
  242. scanf(" %f", &cliente.dinero);
  243.  
  244. if (strcmp(cliente.nombre, " ") == 0 && strcmp(cliente.apellidos, " ") == 0) correcto = 'n';
  245. else correcto = 's';
  246.  
  247. if (correcto == 'n') printf("Los datos introducidos no son validos.\n");
  248. } while (correcto == 'n');
  249. }


En línea

TheWarriorVicent

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Problema con archivos de acceso directo
« Respuesta #1 en: 8 Junio 2011, 22:30 pm »

Resubo el código, le he conseguido hacer unas cuantas mejoras:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct fichaCliente { // tamaño: 68 bits
  5. int cuenta;
  6. char nombre[15], apellidos[45];
  7. float dinero;
  8. } cliente, clienteVacio = {0, "", "", 0.0};
  9.  
  10. short numero_cuentas = 0;
  11.  
  12. void mostrarClientes(FILE *);
  13. void editarCliente(FILE *);
  14. void crearCliente(FILE *);
  15. void eliminarCliente(FILE *);
  16. void comprobarCantidad(FILE *);
  17. void asistenteCreacionCliente(int);
  18.  
  19. int main() {
  20. int opcion;
  21. FILE *basedatos;
  22.  
  23. if (!(basedatos = fopen("base_de_datos.dat", "a+"))) perror("No se ha podido abrir el fichero.\n");
  24. else {
  25. do {
  26. printf("%s\n%s\n%s\n%s\n%s\n%s\n", "¿Que desea hacer?", "1. Mostrar todos los clientes existentes y sus datos",
  27. "2. Editar algun dato de algun cliente existente", "3. Crear una cuenta para un nuevo cliente",
  28. "4. Eliminar un cliente de la lista", "5. Salir del programa");
  29.  
  30. fflush(stdin);
  31. scanf(" %i", &opcion);
  32.  
  33. rewind(basedatos);
  34. comprobarCantidad(basedatos);
  35. rewind(basedatos);
  36.  
  37. printf("%i\n", numero_cuentas);
  38.  
  39. switch(opcion) {
  40. case 1:
  41. mostrarClientes(basedatos);
  42. break;
  43.  
  44. case 2:
  45. editarCliente(basedatos);
  46. break;
  47.  
  48. case 3:
  49. crearCliente(basedatos);
  50. break;
  51.  
  52. case 4:
  53. eliminarCliente(basedatos);
  54. break;
  55.  
  56. case 5:break;
  57.  
  58. default:
  59. printf("Opcion no correcta.\n");
  60. break;
  61. }
  62.  
  63. putchar('\n');
  64. } while (opcion != 5);
  65.  
  66. }
  67.  
  68. fclose(basedatos);
  69. return 0;
  70. }
  71.  
  72. void mostrarClientes(FILE *fichero) {
  73. if (fgetc(fichero) == EOF) {
  74. printf("Error: el fichero esta vacio.\n");
  75. return;
  76. }
  77.  
  78. rewind(fichero);
  79.  
  80. printf("\n%-9s%-16s%-41s%s\n", "Cuenta", "Nombre", "Apellidos", "Dinero");
  81. do {
  82. fread(&cliente, sizeof(struct fichaCliente), 1, fichero);
  83. if (feof(fichero)) // si se omite esto imprimira la ultima cuenta dos veces
  84. if (cliente.cuenta != 0) {
  85. printf("%-9i%-16s%-41s%.2f", cliente.cuenta, cliente.nombre, cliente.apellidos, cliente.dinero);
  86. putchar('\n');
  87. }
  88. } while(!feof(fichero));
  89. }
  90.  
  91. void editarCliente(FILE *fichero) {
  92. if (fgetc(fichero) == EOF) {
  93. printf("Error: el fichero esta vacio.\n");
  94. return;
  95. }
  96.  
  97. //rewind(fichero); <-- innecesario
  98.  
  99. int cuenta, opcion;
  100. float temporal;
  101.  
  102. printf("Introduzca el numero de cuenta del cliente: ");
  103. fflush(stdin);
  104. scanf(" %i", &cuenta);
  105.  
  106. if (cuenta > numero_cuentas) {
  107. printf("El cliente no existe. Cree una cuenta para el.\n");
  108. } else {
  109. fseek(fichero, sizeof(struct fichaCliente) * (cuenta-1), SEEK_SET);
  110. fread(&cliente, sizeof(struct fichaCliente), 1, SEEK_SET);
  111.  
  112. if (!strcmp(cliente.nombre, "")) printf("La cuenta %i contiene un cliente vacio.\n", cuenta);
  113. else {
  114. do {
  115. printf("Que desea modificar?\n%s\n%s\n%s\n%s\n%s\n", "1. Nombre del cliente",
  116. "2. Apellidos del cliente", "3. Dinero del cliente", "4. Añadir/quitar dinero",
  117. "5. Cancelar operacion");
  118. fflush(stdin);
  119. scanf(" %i", &opcion);
  120.  
  121. switch (opcion) {
  122. case 1:
  123. printf("Introduzca el nuevo nombre del cliente: ");
  124. fflush(stdin);
  125. scanf(" %[^\n]", cliente.nombre);
  126. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  127. break;
  128.  
  129. case 2:
  130. printf("Introduzca los nuevos apellidos del cliente: ");
  131. fflush(stdin);
  132. scanf(" %[^\n]", cliente.apellidos);
  133. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  134. break;
  135.  
  136. case 3:
  137. printf("Introduzca la cantidad actual de dinero del cliente: ");
  138. fflush(stdin);
  139. scanf(" %f", &cliente.dinero);
  140. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  141. break;
  142.  
  143. case 4:
  144. printf("Introduzca la cantidad de dinero a añadir/quitar (+/-): ");
  145. fflush(stdin);
  146. scanf(" %f", &temporal);
  147. cliente.dinero += temporal;
  148. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  149. break;
  150.  
  151. case 5:break;
  152. default:printf("Opcion invalida.\n\n");break;
  153. }
  154. } while (opcion != 5);
  155. }
  156. }
  157. }
  158.  
  159. void crearCliente(FILE *fichero) {
  160. int cuenta;
  161. short i, distancia;
  162. char respuesta;
  163.  
  164. printf("Introduzca el numero de cuenta que desea utilizar: ");
  165. fflush(stdin);
  166. scanf(" %i", &cuenta);
  167.  
  168. if(cuenta > numero_cuentas) {
  169. distancia = cuenta - numero_cuentas;
  170.  
  171. fseek(fichero, sizeof(struct fichaCliente) * numero_cuentas, SEEK_SET);
  172.  
  173. for (i = 1; i < distancia; i++) { // antiguo enunciado: for (i = 0; i < distancia; i++); error: i = 0
  174. fwrite(&clienteVacio, sizeof(struct fichaCliente), 1, fichero);
  175. }
  176.  
  177. //fseek(fichero, sizeof(struct fichaCliente) * (cuenta-1), SEEK_SET);
  178. asistenteCreacionCliente(cuenta);
  179. cliente.cuenta = cuenta;
  180. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  181. } else {
  182. fseek(fichero, sizeof(struct fichaCliente) * (cuenta-1), SEEK_SET);
  183. fread(&cliente, sizeof(struct fichaCliente), 1, fichero);
  184.  
  185. if (cliente.cuenta == 0) {
  186. asistenteCreacionCliente(cuenta);
  187. cliente.cuenta = cuenta;
  188. fseek(fichero, sizeof(struct fichaCliente) * (cuenta - 1), SEEK_SET);
  189. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  190. } else {
  191. printf("¡El numero de cuenta ya contiene un cliente! ¿Desea continuar? (s/n) ");
  192. do {
  193. fflush(stdin);
  194. respuesta = getchar();
  195.  
  196. switch (respuesta) {
  197. case 's':
  198. asistenteCreacionCliente(cuenta);
  199. cliente.cuenta = cuenta;
  200. fseek(fichero, sizeof(struct fichaCliente) * (cuenta - 1), SEEK_SET);
  201. fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
  202. break;
  203. case 'n':break;
  204. default: printf("Opcion incorrecta.\n");
  205. }
  206. } while (respuesta != 'n' && respuesta != 's');
  207. }
  208. }
  209. }
  210.  
  211. void eliminarCliente(FILE *fichero) {
  212. if (fgetc(fichero) == EOF) {
  213. printf("Error: el fichero esta vacio.\n");
  214. return;
  215. }
  216.  
  217. int cuenta;
  218. printf("Introduzca el numero de cuenta a eliminar: ");
  219. fflush(stdin);
  220. scanf(" %i", &cuenta);
  221.  
  222. if(cuenta > numero_cuentas) {
  223. printf("Error: el cliente con el numero de cuenta %i no existe.\n", cuenta);
  224. } else {
  225. fseek(fichero, sizeof(struct fichaCliente) * (cuenta-1), SEEK_SET);
  226. fwrite(&clienteVacio, sizeof(struct fichaCliente), 1, fichero);
  227. printf("El cliente %i ha sido eliminado satisfactoriamente.\n", cuenta);
  228. }
  229. }
  230.  
  231. void comprobarCantidad(FILE *fichero) {
  232. if (fgetc(fichero) == EOF) return;
  233.  
  234. rewind(fichero);
  235.  
  236. numero_cuentas = 0;
  237.  
  238. do {
  239. fread(&cliente, sizeof(struct fichaCliente), 1, fichero);
  240. if (feof(fichero)) numero_cuentas++; // si se hace directamente numero_cuentas++ no funcionara correctamente
  241. } while(!feof(fichero));
  242. }
  243.  
  244. void asistenteCreacionCliente(int cuenta) {
  245. char correcto;
  246. do {
  247. printf("Introduzca el nombre del cliente con cuenta %i: ", cuenta);
  248. fflush(stdin);
  249. scanf(" %[^\n]", cliente.nombre);
  250.  
  251. printf("Introduzca los apellidos del cliente con cuenta %i: ", cuenta);
  252. fflush(stdin);
  253. scanf(" %[^\n]", cliente.apellidos);
  254.  
  255. printf("Introduzca la cantidad de dinero que el cliente con numero de cuenta %i posee: ", cuenta);
  256. fflush(stdin);
  257. scanf(" %f", &cliente.dinero);
  258.  
  259. if (strcmp(cliente.nombre, " ") == 0 && strcmp(cliente.apellidos, " ") == 0) correcto = 'n';
  260. else correcto = 's';
  261.  
  262. if (correcto == 'n') printf("Los datos introducidos no son validos.\n");
  263. } while (correcto == 'n');
  264. }

Ahora los problemas que me presenta son los siguientes:
-Sigue sin eliminar las cuentas correctamente.
-No crea bien las cuentas (prueben a crear una cuenta y otra con un numero de cuenta mayor y muestrenlas).
-No edita bien las cuentas tampoco.


En línea

TheWarriorVicent

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Problema con archivos de acceso directo
« Respuesta #2 en: 14 Junio 2011, 20:41 pm »

Problemas solucionados. ¿Cómo? ¿Qué es lo que modifiqué? Pues bien: lo creé desde 0 otra vez. Solución perfecta en muchas ocasiones, pero eso si, no lo intenten con códigos pequeños, pues va deteriorando poco a poco nuestra capacidad de resolver problemas...

El código reescrito desde 0:

Código
  1. #include <stdio.h>
  2. #define INTERROGACION 168
  3. #define EXCLAMACION 173
  4. #define eTILDE 130
  5. #define aTILDE 160
  6. #define iTILDE 161
  7. #define oTILDE 162
  8. #define uTILDE 163
  9. #define eNNE 164
  10. #define LIMPIARBUFFER fflush(stdin)
  11. // si usas linux reemplazar fflush(stdin) por while(getchar() != '\n')
  12.  
  13. int main() {
  14. struct fCliente {
  15. int cuenta;
  16. char nombre[20], apellidos[40];
  17. float dinero;
  18. } cliente, clienteVacio = {0, "Sin nombre", "Sin apellidos", 0.0};
  19. int opcion, opcion2, cuenta, numero_cuentas, numero_cuentas_no_vacias, i = 0;
  20. float temporal;
  21. char respuesta;
  22.  
  23. FILE *fichero = fopen("basededatos.dat", "r+");
  24. if(!fichero) {
  25. fichero = fopen("basededatos.dat", "w+");
  26. for(i = 0; i < 500; i++) fwrite(&clienteVacio, sizeof(struct fCliente), 1, fichero);
  27. }
  28.  
  29. do {
  30. numero_cuentas = 0; numero_cuentas_no_vacias = 0; respuesta = 's';
  31.  
  32. rewind(fichero);
  33. do {
  34. if(fread(&cliente,sizeof(struct fCliente), 1, fichero))
  35. numero_cuentas++;
  36. if (cliente.cuenta > 0) numero_cuentas_no_vacias++;
  37. } while(!feof(fichero));
  38. rewind(fichero);
  39.  
  40. //printf("%i y %i\n", numero_cuentas, numero_cuentas_no_vacias); <-- solo para comprobar funcionamiento
  41.  
  42. printf("%cQu%c desea hacer?\n1. Mostrar lista con todos los clientes\n2. Crear una nueva cuenta\n", INTERROGACION, eTILDE);
  43. printf("3. Editar una cuenta existente\n4. Borrar una cuenta\n5. Salir del programa\nOpci%cn: ", oTILDE);
  44. LIMPIARBUFFER;scanf("%i", &opcion);
  45.  
  46. switch(opcion) {
  47. case 1:
  48. putchar('\n');
  49.  
  50. if (numero_cuentas_no_vacias == 0)
  51. printf("Error: el archivo esta vac%co.\n", iTILDE);
  52. else {
  53. printf("%-9s%-19s%-39s%s\n", "Cuenta", "Nombre", "Apellidos", "Dinero");
  54. do {
  55. fread(&cliente, sizeof(struct fCliente), 1, fichero);
  56. if (cliente.cuenta)
  57. printf("%-9i%-19s%-39s%.2f\n", cliente.cuenta, cliente.nombre, cliente.apellidos, cliente.dinero);
  58. } while (--numero_cuentas > 0);
  59. printf("Hay un total de %i cuenta(s).\n", numero_cuentas_no_vacias);
  60. }
  61.  
  62. putchar('\n');
  63. break;
  64.  
  65. case 2:
  66. printf("Introduzca el n%cmero de la cuenta en la que se almacenar%c al cliente: ", uTILDE, aTILDE);
  67. do {
  68. LIMPIARBUFFER;scanf("%i", &cuenta);
  69. if(!cuenta)
  70. printf("El n%cmero de cuenta 0 no se puede utilizar. Ingrese otro n%cmero: ", uTILDE, uTILDE);
  71. } while (cuenta == 0);
  72.  
  73. if (cuenta > numero_cuentas) {
  74. fseek(fichero, sizeof(struct fCliente) * numero_cuentas, SEEK_SET);
  75. while(++numero_cuentas < cuenta)
  76. fwrite(&clienteVacio, sizeof(struct fCliente), 1, fichero);
  77. } else {
  78. fseek(fichero, sizeof(struct fCliente) * (cuenta - 1), SEEK_SET);
  79. fread(&cliente, sizeof(struct fCliente), 1, fichero);
  80. if (cliente.cuenta > 0) {
  81. printf("%cAtenci%cn! La cuenta ya contiene un cliente. %cDesea continuar? (s/n) ", EXCLAMACION, oTILDE, INTERROGACION);
  82. LIMPIARBUFFER;scanf(" %c", &respuesta);
  83. }
  84. }
  85.  
  86. if (respuesta == 's') {
  87. cliente.cuenta = cuenta;
  88. printf("Introduzca el nombre del cliente: ");
  89. LIMPIARBUFFER;scanf("%[^\n]", cliente.nombre);
  90. printf("Introduzca los apellidos del cliente: ");
  91. LIMPIARBUFFER;scanf("%[^\n]", cliente.apellidos);
  92. printf("Introduzca la cantidad de dinero del cliente: ");
  93. LIMPIARBUFFER;scanf("%f", &cliente.dinero);
  94. }
  95.  
  96. fseek(fichero, sizeof(struct fCliente) * (cuenta - 1), SEEK_SET);
  97. fwrite(&cliente, sizeof(struct fCliente), 1, fichero);
  98.  
  99. putchar('\n');
  100. break;
  101.  
  102. case 3:
  103. if (numero_cuentas_no_vacias == 0)
  104. printf("\nError: el archivo est%c vac%co.\n", aTILDE, iTILDE);
  105. else {
  106. printf("\nIntroduzca la cuenta que desea modificar: ");
  107. LIMPIARBUFFER;scanf("%i", &cuenta);
  108.  
  109. if(!fseek(fichero, sizeof(struct fCliente) * (cuenta - 1), SEEK_SET)) {
  110. fread(&cliente, sizeof(struct fCliente), 1, fichero);
  111.  
  112. if (cliente.cuenta == 0)
  113. printf("Error: la cuenta est%c vac%ca o no existe.\n", aTILDE, iTILDE);
  114. else {
  115. printf("\n%cQu%c desea modificar?\n1. Nombre del cliente\n2. Apellidos del cliente\n3. Dinero del cliente\n4. A%cadir/quitar dinero\n5. Cancelar operaci%cn\nOpci%cn: ",
  116. INTERROGACION, eTILDE, eNNE, oTILDE, oTILDE);
  117. LIMPIARBUFFER;scanf("%i", &opcion2);
  118.  
  119. fseek(fichero, sizeof(struct fCliente) * (cuenta - 1), SEEK_SET);
  120.  
  121. switch(opcion2) {
  122. case 1:
  123. printf("Introduzca el nuevo nombre del cliente: ");
  124. LIMPIARBUFFER;scanf("%[^\n]", cliente.nombre);
  125.  
  126. fwrite(&cliente, sizeof(struct fCliente), 1, fichero);
  127. break;
  128.  
  129. case 2:
  130. printf("Introduzca los nuevos apellidos del cliente: ");
  131. LIMPIARBUFFER;scanf("%[^\n]", cliente.apellidos);
  132.  
  133. fwrite(&cliente, sizeof(struct fCliente), 1, fichero);
  134. break;
  135.  
  136. case 3:
  137. printf("Introduzca la nueva cantidad de dinero del cliente: ");
  138. LIMPIARBUFFER;scanf("%f", &cliente.dinero);
  139.  
  140. fwrite(&cliente, sizeof(struct fCliente), 1, fichero);
  141. break;
  142.  
  143. case 4:
  144. printf("Introduzca la cantidad de dinero que desea a%cadir/quitar (+/-): ", eNNE);
  145. LIMPIARBUFFER;scanf("%f", &temporal);
  146.  
  147. cliente.dinero += temporal;
  148. fwrite(&cliente, sizeof(struct fCliente), 1, fichero);
  149. break;
  150.  
  151. case 5:break;
  152.  
  153. default:printf("Error: opci%cn incorrecta.\n", oTILDE);
  154. }
  155. }
  156. }
  157. }
  158.  
  159. putchar('\n');
  160. break;
  161.  
  162. case 4:
  163. if (numero_cuentas_no_vacias > 0) {
  164. printf("Introduzca la cuenta que desea borrar: ");
  165. LIMPIARBUFFER;scanf("%i", &cuenta);
  166.  
  167. if (!fseek(fichero, sizeof(struct fCliente) * (cuenta - 1), SEEK_SET)) {
  168. fwrite(&clienteVacio, sizeof(struct fCliente), 1, fichero);
  169. printf("Cuenta eliminada satisfactoriamente.\n");
  170. } else
  171. printf("Error: la cuenta seleccionada no existe.\n");
  172. } else
  173. printf("Error: el archivo est%c vac%co.\n", aTILDE, iTILDE);
  174.  
  175. putchar('\n');
  176. break;
  177.  
  178. case 5:break;
  179.  
  180. default:printf("Error: opcion incorrecta.\n\n");
  181. }
  182. } while (opcion != 5);
  183.  
  184. fclose(fichero);
  185.  
  186. return 0;
  187. }
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Acceso directo
Programación Visual Basic
xDie 3 2,410 Último mensaje 7 Noviembre 2006, 19:38 pm
por CeLaYa
crear acceso directo...
Programación Visual Basic
soru13 1 1,928 Último mensaje 28 Diciembre 2006, 03:19 am
por CeLaYa
Crear acceso directo
Programación Visual Basic
Jareth 0 1,493 Último mensaje 13 Mayo 2007, 23:39 pm
por Jareth
manejo de archivos de acceso directo en C++
Programación C/C++
aryel_1203 1 2,928 Último mensaje 13 Diciembre 2016, 13:45 pm
por ivancea96
[Abril Negro] Unir Archivos Exe,Vbs y Bat a Un Acceso Directo lnk
Scripting
Flamer 1 3,809 Último mensaje 17 Marzo 2018, 12:44 pm
por Borito30
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines