Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Rhythmical en 16 Noviembre 2017, 06:49 am



Título: Problema con mostrar listado
Publicado por: Rhythmical en 16 Noviembre 2017, 06:49 am
Hola a todos, bueno mi problema es el siguiente y es que al ingresar N variables al mostrar el listado me sale infinitas veces como si al valor N lo tomase como otro numero y no se  a que se debe el problema si ya aplique el rewind y el fread.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. typedef char cadena [50];
  6.  
  7.  
  8. struct registro
  9.  
  10. {
  11. int numcount;
  12. cadena type;
  13. float saldo;
  14. };
  15.  
  16. void charge(int n, registro reg, FILE*archi)
  17. {
  18. int com1, com2, com3, com4, com5, com6, com7, com8;
  19.  
  20. cadena cad1 = "c";
  21. cadena cad2 = "C";
  22. cadena cad3 = "a";
  23. cadena cad4 = "A";
  24. cadena cad5 = "t";
  25. cadena cad6 = "T";
  26. cadena cad7 = "s";
  27. cadena cad8 = "S";
  28.  
  29. for(int i=0; i<n ;i++)
  30. {
  31. printf("\n**REGISTRO NRO: %d**",i+1);
  32. printf("\nIngrese NRO de cuenta: "); scanf("%d",&reg.numcount);
  33. printf("\nIngrese TIPO de cuenta: "); _flushall();gets(reg.type);
  34. printf("\nIngrese saldo previo: "); scanf("%f",&reg.saldo);
  35.  
  36. com1 = strcmp(reg.type,cad1);
  37. com2 = strcmp(reg.type,cad2);
  38. com3 = strcmp(reg.type,cad3);
  39. com4 = strcmp(reg.type,cad4);
  40. com5 = strcmp(reg.type,cad5);
  41. com6 = strcmp(reg.type,cad6);
  42. com7 = strcmp(reg.type,cad7);
  43. com8 = strcmp(reg.type,cad8);
  44.  
  45. if (com1 == 0 || com2 == 0)
  46. {
  47. printf("\nCUENTA CORRIENTE");
  48. }
  49. if (com3 == 0 || com4 == 0)
  50. {
  51. printf("\nCAJA DE AHORRO");
  52. }
  53. if (com5 == 0 || com6 == 0)
  54. {
  55. printf("\nPLAZO FIJO 30 DIAS");
  56. }
  57. if (com7 == 0 || com8 == 0)
  58. {
  59. printf("\nPLAZO FIJO 60 DIAS");
  60. }
  61. fwrite(&reg,sizeof(reg),1,archi);
  62. }//for
  63. }
  64.  
  65. void show(int n, registro reg, FILE *archi, float &ns)
  66. {
  67. int com1, com2, com3, com4, com5, com6, com7, com8;
  68. cadena cad1 = "c";
  69. cadena cad2 = "C";
  70. cadena cad3 = "a";
  71. cadena cad4 = "A";
  72. cadena cad5 = "t";
  73. cadena cad6 = "T";
  74. cadena cad7 = "s";
  75. cadena cad8 = "S";
  76.  
  77. system ("cls");
  78. printf("\nSE MOSTRARA LA LISTA DE LOS DATOS\n");
  79. system ("pause");
  80.  
  81. rewind(archi);
  82. fread(&reg, sizeof(reg),1,archi);
  83.  
  84. while (!feof(archi))
  85. {
  86. printf("\nNRO DE CUENTA: %d", reg.numcount);
  87. printf("\nTIPO: ");puts(reg.type);
  88.  
  89. com1 = strcmp(reg.type,cad1);
  90. com2 = strcmp(reg.type,cad2);
  91. com3 = strcmp(reg.type,cad3);
  92. com4 = strcmp(reg.type,cad4);
  93. com5 = strcmp(reg.type,cad5);
  94. com6 = strcmp(reg.type,cad6);
  95. com7 = strcmp(reg.type,cad7);
  96. com8 = strcmp(reg.type,cad8);
  97.  
  98. if (com1 == 0 || com2 == 0)
  99. {
  100. ns = reg.saldo;
  101. printf("\nSaldo actual: %.2f", ns);
  102. }
  103. else
  104. {
  105. if (com3 == 0 || com4 == 0)
  106. {
  107. ns = reg.saldo + (reg.saldo*0.03);
  108. printf("\nSaldo actual: %.2f", ns);
  109. }
  110. else
  111. {
  112. if (com5 == 0 || com6 == 0)
  113. {
  114. ns = reg.saldo + (reg.saldo*0.05);
  115. printf("\nSaldo actual: %.2f", ns);
  116. }
  117. else
  118. {
  119. if (com7 == 0 || com8 == 0)
  120. {
  121. ns = reg.saldo + (reg.saldo*0.09);
  122. printf("\nSaldo actual: %.2f", ns);
  123. }
  124. }
  125.    }
  126.    }
  127.    fread(&reg,sizeof(reg),1,archi);
  128. }
  129. }
  130.  
  131. main()
  132. {
  133. FILE *archi;
  134. int n;
  135. registro reg;
  136. float ns = 0.0;
  137.  
  138. archi = fopen("account.dat", "w+b");
  139.  
  140. if(archi = NULL)
  141. {
  142. printf("\nLo sentimos, el archivo no existe");
  143. system ("PAUSE");
  144. exit(1);
  145. }
  146. printf ("\nIngrese la N cantidad de archivos ");scanf("%d", &n);
  147.  
  148. charge(n,reg,archi);
  149. show(n,reg,archi,ns);
  150.  
  151. fclose(archi);
  152.  
  153. }

como siempre espero su ayuda, Saludos!.


Título: Re: Problema con mostrar listado
Publicado por: MAFUS en 16 Noviembre 2017, 22:21 pm
Usa los parámetros de las funciones para pasar información a la función, no para crear variables locales.
Cuando guardes estructuras a un archivo guárdalas campo a campo, no la estructura entera, así te asegurarás que sabes cómo está contenida la información. La forma interna de la estructura la acomoda el compilador de la forma más eficiente y puede diferir a cómo la has definido, por eso guardar esa estructura directamente en el disco puede llevarte a una desagradable sorpresa.