• Domingo 28 de Abril de 2024, 23:17

Autor Tema:  Operaciones Con Ficheros  (Leído 5097 veces)

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Operaciones Con Ficheros
« en: Viernes 15 de Diciembre de 2006, 01:39 »
0
Hola.

Ahora mismo estoy con una práctica de ficheros. El programa me permite introducir datos en el fichero y luego consultarlos. Pero me gustaría poder hacer "operaciones" con los datos introducidos en el fichero, pero no ando muy sobrado y me gustaría saber como podría hacerlo.

¿Alguien me puede echar una mano? Ahí va el código.

Citar
/*Escribir un programa en C que a partir de un fichero dado con el formato adecuado:
a) Cuente el nº de clientes de un banco con al menos 40 años y saldo en cuenta inferior a 1.200 euros;
b ) Imprima el saldo menor y el saldo mayor de los clientes mayores de 30 años;
c) Imprima la edad media de todos los clientes;
d) Imprima el número de clientes que se llaman igual y viven en la misma ciudad;*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>


struct banco {
int Ncliente;
char Nombre[15];
char Ap[20];
int Edad;
int Saldo;
char Ciudad[20];
};
struct banco Banco[10]; /* max 10 clientes */
/* variable global para guardar los datos de los clientes */

void InsertarCliente();
/* Añade un nuevo cliente al final del fichero */

void ConsultarCliente();
/* Consulta los datos personales de un cliente a traves de la clave del fichero */

void ConsultarEstadisticas();
/* Consulta las estadisticas de los clientes introducidos */


void InsertarCliente()
/* Anade un nuevo cliente al final del fichero */
{FILE *fp;
int Edad, NCliente, Saldo;
char Nombre[20], Ap[20], Ciudad[20];
printf("Cuales son los datos del cliente a insertar?\n");
printf("NCliente:");
scanf("%d", &NCliente);
fflush(stdin);
printf("Nombre:");
gets(Nombre);
fflush(stdin);
printf("Apellido:");
gets(Ap);
printf("Edad:");
scanf("%d", &Edad);
fflush(stdin);
printf("Saldo:");
scanf("%d",&Saldo);
fflush(stdin);
printf("Ciudad:");
gets(Ciudad);
if ((fp=fopen("banco.txt", "a"))==NULL) /* detecta error */
{printf("Error al abrir el fichero");
}
fprintf(fp, "%d %s %s %d %d %s\n", NCliente, Nombre, Ap, Edad, Saldo, Ciudad);
/* escribimos el registro al final del fichero */
if (fclose(fp)==0)
{printf("\nFichero cerrado correctamente");
}
else {printf("Error al cerrar fichero");
}
}

void ConsultarCliente()
/* Consulta los datos personales de un cliente a traves del campo clave NCliente */
{FILE *fp;
int i=0, salir=0, Mat;
printf("Cual es el numero de matricula del cliente a consultar? ");
scanf("%d", &Mat);
if ((fp=fopen("banco.txt", "r"))==NULL) /* detecta error */
{printf("Error al abrir el fichero");
}
do
{/* de paso guardamos los datos en estructuras adecuadas */
fscanf(fp, "%d %s %s %d %d %s\n", &(Banco.Ncliente), Banco.Nombre, Banco.Ap, &(Banco.Edad), &(Banco.Saldo), Banco.Ciudad);
if (Mat==Banco.Ncliente)
{printf("%d %s %s %d %d %s\n", Banco.Ncliente, Banco.Nombre, Banco.Ap, Banco.Edad, Banco.Saldo, Banco.Ciudad);
salir=1;
}
else
{i++;
}
}
while (salir!=1 && !feof(fp));
if (fclose(fp)==0)
{printf("\nFichero cerrado correctamente");
}
else {printf("Error al cerrar fichero");
}
getch();

}

void ConsultarEstadisticas()
/* Consulta las estadisticas de los clientes introducidos */

{

//AQUÍ SUPONGO QUE IRÍAN LAS OPERACIONES

main ()
{FILE * fp, *fp2;
char c;
int x, resp;
char titulo[15][30];
char director[15][20];
int cinta[15];
for (;
{do
{//clrscr();
printf("\nMENU PROGRAMA\n");
printf("----------------\n");
printf("1. Insertar nuevo cliente\n");
printf("2. Consultar cliente\n");
printf("3. Terminar\n");
scanf("%d", &resp);
}
while (resp!=1 && resp!=2 && resp!=3 && resp!=4); /* solo aceptamos respuestas validas */
switch (resp)
{case 1: InsertarCliente();
break;
case 2: ConsultarCliente();
break;
case 3: ConsultarEstadisticas();
break;
default: printf("\nFin de programa\a");
exit(0);
break;
}
}
}

Mollense

  • Miembro de PLATA
  • *****
  • Mensajes: 1755
  • Nacionalidad: ar
    • Ver Perfil
    • http://solocodigo.com/
Re: Operaciones Con Ficheros
« Respuesta #1 en: Viernes 15 de Diciembre de 2006, 02:32 »
0
Dinos...operaciones de que tipo?

 :think:
"Los que renuncian son más numerosos que los que fracasan" H.F.
"No se cómo sería la III Guerra Mundial, pero la cuarta sería con piedras" A.E.
"Quién no fía no es de fiar..."


...no te quedes mirando.

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Operaciones Con Ficheros
« Respuesta #2 en: Viernes 15 de Diciembre de 2006, 02:35 »
0
Hola.

Gracias por tu atención.

En realidad lo que necesito es:

a) Cuente el nº de clientes de un banco con al menos 40 años y saldo en cuenta inferior a 1.200 euros.
B) Imprima el saldo menor y el saldo mayor de los clientes mayores de 30 años.
c) Imprima la edad media de todos los clientes.
d) Imprima el número de clientes que se llaman igual y viven en la misma ciudad.

Esto es lo que no se cómo hacer.

Un saludo.

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Operaciones Con Ficheros
« Respuesta #3 en: Viernes 15 de Diciembre de 2006, 02:55 »
0
Creas una variable global con el numero de clientes (num_clientes) que se incrementa cada vez que insertas un cliente y para encontrar los clientes que necesitas haces algo como:

Código: Text
  1. int i, cuenta_clientes = 0, menor = Banco[0].Saldo, mayor = Banco[0].Saldo, media, iguales = 0, total = 0, j;
  2. for (i = 0; i &#60; num_clientes; i++)  {
  3.       // para los clientes con mas de 40 años y mas de 1.200 euros de saldo
  4.       if ((Banco[i].Edad &#62; 40) && (Banco[i].Saldo &#62; 1200))  {
  5.            cuenta_clientes++;
  6.       }
  7.       // Calculo del mayor de los saldos
  8.       if (Banco[i].Saldo &#62; mayor)  {
  9.          mayor = Saldo[i].Saldo;
  10.       }
  11.       // Calculo del menor de los saldos
  12.       if (Banco[i].Saldo &#60; menor)   {
  13.           menor = Banco[i].Saldo;
  14.       }
  15.       // Calculo de la edad media de los clientes
  16.       total = total + Banco[i].Edad;
  17.      
  18.       // Calculo de los nombres y las ciudades iguales
  19.       for (j = i + 1&#59; j &#60; num_clientes; j++)  {
  20.             if ((strcmp(Banco[i].Nombre,Banco[j].Nombre) == 0) && (strcmp(Banco[i].Ciudad,Banco[j].Ciudad) == 0))  {
  21.                 iguales++;
  22.             }
  23.       }
  24. }
  25. media = total / num_clientes;
  26.  
  27.  


Mas o menos es eso, espero que te sirva.

Apunte: Seria bueno que pusieras el saldo como float, por si aparece en el banco algun rico  :P

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Operaciones Con Ficheros
« Respuesta #4 en: Viernes 15 de Diciembre de 2006, 03:30 »
0
Hola Max. Gracias por responder.

Lo debo de ahcer mal. No me funciona. Creo la variable global y luego meto el código que me has dado debajo del cuerpo de las otras. Algo así:

Código: Text
  1. /*Escribir un programa en C que a partir de un fichero dado con el formato adecuado:
  2. a) Cuente el nº de clientes de un banco con al menos 40 años y saldo en cuenta inferior a 1.200 euros;
  3. b ) Imprima el saldo menor y el saldo mayor de los clientes mayores de 30 años;
  4. c) Imprima la edad media de todos los clientes;
  5. d) Imprima el número de clientes que se llaman igual y viven en la misma ciudad;*/
  6.  
  7. #include &#60;stdio.h&#62;
  8. #include &#60;stdlib.h&#62;
  9. #include &#60;conio.h&#62;
  10.  
  11.  
  12. struct banco {
  13. int Ncliente;
  14. char Nombre[15];
  15. char Ap[20];
  16. int Edad;
  17. int Saldo;
  18. char Ciudad[20];
  19. };
  20. struct banco Banco[10]; /* max 10 clientes */
  21. /* variable global para guardar los datos de los clientes */
  22.  
  23. void InsertarCliente();
  24. /* Añade un nuevo cliente al final del fichero */
  25.  
  26. void ConsultarCliente();
  27. /* Consulta los datos personales de un cliente a traves de la clave del fichero */
  28.  
  29. void num_clientes();
  30. /* Consulta las estadisticas de los clientes introducidos */
  31.  
  32. void InsertarCliente()
  33. /* Anade un nuevo cliente al final del fichero */
  34. {FILE *fp;
  35. int Edad, NCliente, Saldo;
  36. char Nombre[20], Ap[20], Ciudad[20];
  37. printf(&#34;Cuales son los datos del cliente a insertar?&#092;n&#34;);
  38. printf(&#34;NCliente:&#34;);
  39. scanf(&#34;%d&#34;, &NCliente);
  40. fflush(stdin);
  41. printf(&#34;Nombre:&#34;);
  42. gets(Nombre);
  43. fflush(stdin);
  44. printf(&#34;Apellido:&#34;);
  45. gets(Ap);
  46. printf(&#34;Edad:&#34;);
  47. scanf(&#34;%d&#34;, &Edad);
  48. fflush(stdin);
  49. printf(&#34;Saldo:&#34;);
  50. scanf(&#34;%d&#34;,&Saldo);
  51. fflush(stdin);
  52. printf(&#34;Ciudad:&#34;);
  53. gets(Ciudad);
  54. if ((fp=fopen(&#34;banco.txt&#34;, &#34;a&#34;))==NULL) /* detecta error */
  55. {printf(&#34;Error al abrir el fichero&#34;);
  56. }
  57. fprintf(fp, &#34;%d %s %s %d %d %s&#092;n&#34;, NCliente, Nombre, Ap, Edad, Saldo, Ciudad);
  58. /* escribimos el registro al final del fichero */
  59. if (fclose(fp)==0)
  60. {printf(&#34;&#092;nFichero cerrado correctamente&#34;);
  61. }
  62. else {printf(&#34;Error al cerrar fichero&#34;);
  63. }
  64. }
  65.  
  66. void ConsultarCliente()
  67. /* Consulta los datos personales de un cliente a traves del campo clave NCliente */
  68. {FILE *fp;
  69. int i=0, salir=0, Mat;
  70. printf(&#34;Cual es el numero de matricula del cliente a consultar? &#34;);
  71. scanf(&#34;%d&#34;, &Mat);
  72. if ((fp=fopen(&#34;banco.txt&#34;, &#34;r&#34;))==NULL) /* detecta error */
  73. {printf(&#34;Error al abrir el fichero&#34;);
  74. }
  75. do
  76. {/* de paso guardamos los datos en estructuras adecuadas */
  77. fscanf(fp, &#34;%d %s %s %d %d %s&#092;n&#34;, &(Banco[i].Ncliente), Banco[i].Nombre, Banco[i].Ap, &(Banco[i].Edad), &(Banco[i].Saldo), Banco[i].Ciudad);
  78. if (Mat==Banco[i].Ncliente)
  79. {printf(&#34;%d %s %s %d %d %s&#092;n&#34;, Banco[i].Ncliente, Banco[i].Nombre, Banco[i].Ap, Banco[i].Edad, Banco[i].Saldo, Banco[i].Ciudad);
  80. salir=1;
  81. }
  82. else
  83. {i++;
  84. }
  85. }
  86. while (salir!=1 && !feof(fp));
  87. if (fclose(fp)==0)
  88. {printf(&#34;&#092;nFichero cerrado correctamente&#34;);
  89. }
  90. else {printf(&#34;Error al cerrar fichero&#34;);
  91. }
  92. getch();
  93.  
  94. }
  95.  
  96. void num_clientes()
  97. /* Consulta las estadisticas de los clientes introducidos */
  98. {int i, cuenta_clientes = 0, menor = Banco[0].Saldo, mayor = Banco[0].Saldo, media, iguales = 0, total = 0, j;
  99. for (i = 0; i &#60; num_clientes; i++)  {
  100.      // para los clientes con mas de 40 años y mas de 1.200 euros de saldo
  101.     if ((Banco[i].Edad &#62; 40) && (Banco[i].Saldo &#62; 1200))  {
  102.           cuenta_clientes++;
  103.      }
  104.     // Calculo del mayor de los saldos
  105.      if (Banco[i].Saldo &#62; mayor)  {
  106.         mayor = Saldo[i].Saldo;
  107.     }
  108.      // Calculo del menor de los saldos
  109.      if (Banco[i].Saldo &#60; menor)   {
  110.       menor = Banco[i].Saldo;
  111.      }
  112.      // Calculo de la edad media de los clientes
  113.     total = total + Banco[i].Edad;
  114.      
  115.      // Calculo de los nombres y las ciudades iguales
  116.     for (j = i + 1; j &#60; num_clientes; j++)  {
  117.            if ((strcmp(Banco[i].Nombre,Banco[j].Nombre) == 0) && (strcmp(Banco[i].Ciudad,Banco[j].Ciudad) == 0))  {
  118.                iguales++;
  119.         }
  120.      }
  121. }
  122. media = total / num_clientes;
  123.  
  124.  
  125. //AQUÍ SUPONGO QUE IRÍAN LAS OPERACIONES
  126.  
  127. main ()
  128. {FILE * fp, *fp2;
  129. char c;
  130. int x, resp;
  131. char titulo[15][30];
  132. char director[15][20];
  133. int cinta[15];
  134. for (;
  135. {do
  136. {//clrscr();
  137. printf(&#34;&#092;nMENU PROGRAMA&#092;n&#34;);
  138. printf(&#34;----------------&#092;n&#34;);
  139. printf(&#34;1. Insertar nuevo cliente&#092;n&#34;);
  140. printf(&#34;2. Consultar cliente&#092;n&#34;);
  141. printf(&#34;3. Numero de cliente&#092;n&#34;);
  142. printf(&#34;3. Terminar&#092;n&#34;);
  143. scanf(&#34;%d&#34;, &resp);
  144. }
  145. while (resp!=1 && resp!=2 && resp!=3 && resp!=4); /* solo aceptamos respuestas validas */
  146. switch (resp)
  147. {case 1: InsertarCliente();
  148. break;
  149. case 2: ConsultarCliente();
  150. break;
  151. case 3: num_clientes();
  152. break;
  153. default: printf(&#34;&#092;nFin de programa&#092;a&#34;);
  154. exit(0);
  155. break;
  156. }
  157. }
  158. }
  159.  

¿Qué está mal en el tocho?

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Operaciones Con Ficheros
« Respuesta #5 en: Viernes 15 de Diciembre de 2006, 03:50 »
0
He cambiado algunas cosas de tu codigo y te lo deje sin errores, el funcionamiento no lo he probado, eso te toca a ti  :whistling:
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Operaciones Con Ficheros
« Respuesta #6 en: Viernes 15 de Diciembre de 2006, 11:44 »
0
Buenos dias.

El código compila perfectamente, pero a la hora de introducir las opciones del menu no hace nada.

Lo he modificado un poco para que entre en el menu y y se puedan realizar las acciones pertinentes. Todas funcionan bien salvo la de las estadístcas. Cuando se pulsa el 3 te devuelve el Menú y asi todo el rato. Te adjunto el codigo.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Operaciones Con Ficheros
« Respuesta #7 en: Sábado 16 de Diciembre de 2006, 16:28 »
0
Me acabo de dar cuenta que inicializas la variable cuenta_clientes=0 pero luego no la utilizas. Puede que venga de ahí el error. Si me lo puedes aclarar...porque ando ya...buff.

Un saludo.

EDITO: Vale lo de cuenta_clientes lo utilizas para el apartado a). Perdona, es que estoy ciego ya de tanto mirar. El que no utilizas es el de num_clientes que es el valor máximo de los bucles for, pero no aparece definido. ¿Hasta que valor recorre?

¡¡¡Madre mía!!! Deseando estoy que se pase el lunes para entregar las dichosas prácticas. ¡¡¡Qué agobio!!!

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Operaciones Con Ficheros
« Respuesta #8 en: Sábado 16 de Diciembre de 2006, 20:25 »
0
Si te fijas num_clientes se incrementa al insertar un nuevo cliente.

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Operaciones Con Ficheros
« Respuesta #9 en: Sábado 16 de Diciembre de 2006, 20:50 »
0
Pero no funciona en el menu. Al pulsar el 3 vuelve a sacar el Menu.

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Operaciones Con Ficheros
« Respuesta #10 en: Domingo 17 de Diciembre de 2006, 00:12 »
0
Si ejecutaras el programa paso a paso verias que SI hace la opcion 3, SI lo saca por pantalla, lo que pasa es que el clrscr() que aparece en el menu limpia la pantalla y no te deja ver los resultados. Prueba a ponerlo en comentario o a poner un getch() despues de sacar por pantalla las estadisticas  :P

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Operaciones Con Ficheros
« Respuesta #11 en: Domingo 17 de Diciembre de 2006, 00:26 »
0
Hola.

Pues a mi es que no me sale. El clrscr está con comentarios y he puesto getch() también, pero nada, sigue igual.  

Ya es que no se que hacer. Mis recursos son limitados.

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Operaciones Con Ficheros
« Respuesta #12 en: Domingo 17 de Diciembre de 2006, 00:35 »
0
El código es ese.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Operaciones Con Ficheros
« Respuesta #13 en: Domingo 17 de Diciembre de 2006, 01:01 »
0
Hola de nuevo, una pregunta: si cuando ejecutas tu programa ni lees desde fichero nada ni guardas nada en la estructura Banco, que esperas que te muestre? Consejo: crea una funcion que lea desde el fichero que creas para poder emplear las estadisticas.  :comp:

Aqui te dejo el codigo que a mi si me funciona

http://www.megaupload.com/?d=VIS5HG8P

Saludos  :hola:

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Operaciones Con Ficheros
« Respuesta #14 en: Domingo 17 de Diciembre de 2006, 02:19 »
0
Me parece que no se hacer bien eso que dices. Algo he intentado.

Por cierto, ahora si me saca por pantalla las estadísticas. Pero esto sólo ocurre cuando yo ejecuto el programa, hago el ingreso de un cliente y luego le doy a consultar estadisticas. Si cuando yo ejecuto el programa voy directamente a mirar las estadísticas es cuadno no me la muestra y sale de nuevo el menu. Y eso es lo que me gustaría cambiar. Resumiendo, que si hay algunos datos de clientes guardados en el fichero banco.txt y yo ejecuto el programa, dándole SÓLO a consultar estadísticas me las muestre directamente, sin hacer otra cosa.

No se si eso es lo que tu pensabas que quería o era otra cosa. Pero es que así tengo que ingresar por lo visto un cliente para poder visualizarlas por pantalla.

Otra cosa es que las estadisticas me las consulta de los clientes que ingreso en el momento que estoy ejecutando el programa y no del fichero completo. Y los valores que saca no son correctos.

Siento estar dándote la brasa todo el rato con mis problemas, que son míos y a nadie más incumben, pero es que no se las horas que llevo ya delante del ordenador intentando sacar algo en claro. Tu lo ves todo tan sencillo y a mi me resulta todo tan complicado. Me veo impotente por no poder sacar adelante el dichoso ejercicio.  

Y el caso es que no puedo dejar de revisarlo, aunque esté hasta las narices de él, porque tengo que entregarlo ya este lunes.

Buff, voy a odiar la programación a este paso.

Te paso nuevamente el código por si quieres molestarte en mirarlo.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Operaciones Con Ficheros
« Respuesta #15 en: Domingo 17 de Diciembre de 2006, 04:15 »
0
Me dices que solo te muestra las estadisticas cuando ejecutas el programa, ingresas un cliente y luego le das a la opcion de visualizar las estadisticas no? Eso es porque en tu tabla Banco no tienes informacion almacenada. Cuando ingresas un cliente y cierras el programa, ese cliente se guarda en el fichero de texto. Lo que decia es que, justo al empezar el main, cargues toda la informacion que esta en el fichero de texto. Asi al elegir la opcion de visualizar las estadisticas te apareceran, sin tener que volver a introducir clientes.

Eso es lo que yo te he entendido. Si te entendi mal, explicamelo mas claramente  :rolleyes:

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Operaciones Con Ficheros
« Respuesta #16 en: Domingo 17 de Diciembre de 2006, 12:34 »
0
¿Y cómo hago para cargar los datos del fichero?

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Operaciones Con Ficheros
« Respuesta #17 en: Domingo 17 de Diciembre de 2006, 14:54 »
0
Leer desde fichero es la mejor opcion: solo tienes que utilizar las funciones que vienen aqui. Ejemplo (en "pseudocodigo"):

Código: Text
  1. FILE * archivo;
  2. char c;
  3.  
  4. if ((archivo=fopen(&#34;Datos.txt&#34;,&#34;r&#34;))!=NULL)  {
  5.      c = getc(archivo);
  6.      while (c != '&#092;n')  {
  7.               // aqui vas almacenando los caracteres
  8.      }    
  9. }
  10.  
  11.  


Luego hay otra opcion algo mas "cutre" por asi decirlo, seria poner esto justo al principio del main
Código: Text
  1.  
  2. Banco[0].NCliente = 0001;
  3. Banco[0].Nombre = &#34;Pepe&#34;;
  4. Banco[0].Ap = &#34;Lopez&#34;;
  5. Banco[0].Edad = 25;
  6. Banco[0].Saldo = 5000;
  7. Banco[0].Ciudad = &#34;Madrid&#34;;
  8. Banco[1].NCliente = 0002;
  9. Banco[1].Nombre = &#34;Luis&#34;;
  10. Banco[1].Ap = &#34;Perez&#34;;
  11. Banco[1].Edad = 45;
  12. Banco[1].Saldo = 1000;
  13. Banco[1].Ciudad = &#34;Barcelona&#34;;
  14. Banco[2].NCliente = 0003;
  15. Banco[2].Nombre = &#34;Maria&#34;;
  16. Banco[2].Ap = &#34;De la O&#34;;
  17. Banco[2].Edad = 69;
  18. Banco[2].Saldo = 10000;
  19. Banco[2].Ciudad = &#34;Trebujena&#34;;
  20.  
  21. num_clientes = 3;
  22.  
  23.  


Esto lo puedes probar y ver si te van las estadisticas, es el metodo rapido. Consejo: haz esto y mira si te van las estadisticas y si te da tiempo (como dices que es para el lunes) intenta hacerlo leyendo del mismo fichero en el que guardas. Saludos  :hola:

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Operaciones Con Ficheros
« Respuesta #18 en: Domingo 17 de Diciembre de 2006, 15:24 »
0
¿Sería así y darle a compilar:

Código: Text
  1. main ()
  2. {FILE *fp;
  3. char c;
  4. int resp;
  5.  
  6. if ((fp=fopen(&#34;banco.txt&#34;,&#34;r&#34;))!=NULL)  {
  7.    c = getc(fp);
  8.    while (c != '&#092;n')  {
  9.          // aqui vas almacenando los caracteres
  10.    }
  11. }
  12.  

Es que no se donde va cada cosa. Cada ves me meto más en el barro. Menudo lío.

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Operaciones Con Ficheros
« Respuesta #19 en: Domingo 17 de Diciembre de 2006, 16:12 »
0
Es casi pseudocodigo, no puedes copiar y pegar. Dentro del while vas cogiendo los caracteres y los vas metiendo primero el NCliente (tienes que pasarlo a entero antes de asignarselo a NCliente), Nombre, Ap, etc. Como en el fichero de texto estan separados por un espacio, ese espacio es el que puedes usar para saber cuando termina un nombre. Ejemplo de como puede ir:

Código: Text
  1. FILE *fp;
  2. char c;
  3. int pos = 0;
  4. int num_clientes = 0;
  5. char cad[5];
  6.  
  7. if ((fp=fopen(&#34;Datos.txt&#34;,&#34;r&#34;))!=NULL)  {
  8.      c = getc(fp);
  9.      Banco[num_clientes].NCliente = atoi(c);
  10.      // atoi pasa de char a entero creo
  11.      c = getc(fp);  // coge el espacio que separa NCliente de Nombre
  12.      c = getc(fp);
  13.      while (c != ' ')  { // mientras q no llegue el espacio que separa Nombre de Ap
  14.               Banco[num_clientes].Nombre[pos] = c;
  15.               pos++;
  16.               c = getc(fp);
  17.      } // Esto bucle while te va metiendo caracter a caracter el nombre del cliente
  18.      c = getc(fp);
  19.      pos = 0;
  20.      while (c != ' ')  { // Ahora hacemos lo mismo con Ap
  21.               Banco[num_clientes].Ap[pos] = c;
  22.               pos++;
  23.               c = getc(fp);  
  24.     }
  25.     c = getc(fp);
  26.     pos = 0;
  27.     while (c != ' ')  {
  28.              cad[pos] = c;
  29.              pos++;
  30.              c = getc(fp);
  31.     }
  32.     cad[pos] = '&#092;n';
  33.     Banco[num_clientes].Edad = atoi(cad); // Volvemos a pasar la cadena cad a entero
  34.     pos = 0;
  35.     c = getc(fp);
  36.     while (c != ' ')  {
  37.              cad[pos] = c;
  38.              pos++;
  39.              c = getc(fp);
  40.     }
  41.     cad[pos] = '&#092;n';
  42.     Banco[num_clientes].Saldo = atoi(cad);  
  43.     pos = 0;
  44.     c = getc(fp);
  45.     while (c != ' ')  {
  46.              Banco[num_clientes].Ciudad[pos] = c;
  47.              pos++;
  48.              c = getc(fp);
  49.     }
  50.     num_clientes++;
  51. }
  52.  
  53.  


Asi mas o menos se podria leer un cliente, no es nada compilado, solo escrito aqui, lo puedes copiar pero eso seguramente no compile. De todas formas, te recomiendo la otra opcion para comprobar que las estadisticas te funcionan correctamente.

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Operaciones Con Ficheros
« Respuesta #20 en: Domingo 17 de Diciembre de 2006, 16:16 »
0
Pero como quedaría el programa listo para compilar, es que con tanto código para acá y para allá, ya no se donde va una cosa y otra.

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Operaciones Con Ficheros
« Respuesta #21 en: Domingo 17 de Diciembre de 2006, 17:20 »
0
Todo mascadito y bien mascadito. Aqui esta todo unido. Fin.

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Operaciones Con Ficheros
« Respuesta #22 en: Domingo 17 de Diciembre de 2006, 18:16 »
0
Hola.

Te doy la gracias por todo lo que has hecho hasta ahora. Es de agradecer que te hallas implcado tanto. Otros ya lo habráin dejado.

Yo entiendo que estes un poco mosqueadillo por todo el trabajo que te estoy dando y porque seguramente creas que no hago nada. Puede que bajo tu punto de vista, efectivamente, no haga nada pero puede que sea por que lo que para ti es un pasito de nada, para mi entenderlo es un un mundo.

He probado el último código y si me saca por pantalla las estadísticas pero no salen bien. Sale en todos los casos 0 salvo el último que sale 1 (poniendo adrede nombres y ciudades iguales de dos clientes).

No se si será por el compilador (yo uso Turbo C++ 4.5), pero después de mostrarme las estadísticas el programa se queda "pillao" y sale el típico mesajito de Windows de enviar error.

Todas las líneas que has puesto comentadas en la función CargarDatos() (//Banco[0].Ncliente = ; , etc...), al escribir los datos a pelo y quitarle los comentarios me da tantos errores como las líneas que había comentadas.

Ya se que la programación es pelearse con los programas. Llevo toda la semana en guerra con el C. Para que veas que si le doy al asunto he intentado hacerlo, pero de otra manera. Si, es más cutre pero bueno, al menos funcionan las 3 partes primeras. Me falla la última, que imprima el numero de clientes que se llaman igual y viven en la misma ciudad.

Te paso el código para que veas que me he estado peleando con el programa.

De todas formas gracias. Me ayudaste mucho.

Un saludo.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Operaciones Con Ficheros
« Respuesta #23 en: Domingo 17 de Diciembre de 2006, 18:54 »
0
Cambia la linea de comparacion del nombre y la ciudad por esta:
Código: Text
  1. if (((strcmp(Banco[i].Nombre,Banco[j].Nombre)) == 0) && ((strcmp(Banco[i].Ciudad,Banco[j].Ciudad)) == 0))  {
  2.  

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Operaciones Con Ficheros
« Respuesta #24 en: Domingo 17 de Diciembre de 2006, 19:21 »
0
Al pulsar la opcion 3 sólo saca el primer registro. Además se me queda pillado.

La media me sale errónea también. Con 2 registros de 29 y 35 años me saca una media de 7. No sé que pasará.