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


 


Tema destacado: Píldoras formativas en seguridad de la información


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Archivos binarios
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Archivos binarios  (Leído 361 veces)
Beginner Web

Desconectado Desconectado

Mensajes: 186


youtu.be/0YhflLRE-DA


Ver Perfil
Archivos binarios
« en: 5 Octubre 2018, 11:49 »

Hola, miren no se que estoy haciendo mal a  la hora de agregar un nuevo registro, quiero que guardar registros de alumnos teniendo en cuenta que sus codigo de alumno no se deben repetir, no se que estoy haciendo mal  :(

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. typedef char tcad[50];
  8. typedef struct talumno{
  9. int libreta;
  10. tcad nombre;
  11. tcad carrera;
  12. };
  13. typedef FILE *parchivo;
  14.  
  15. void carga(talumno &a);
  16. void cargar_alumnos(parchivo alumnos);
  17. void mostrar(parchivo alumnos);
  18. void borrar(parchivo alumnos, int buscado);
  19. bool consulta(parchivo alumnos, int codigo);
  20.  
  21. main()
  22. {
  23. int codigoBuscado;
  24. parchivo estudiantes;
  25. cargar_alumnos(estudiantes);
  26. mostrar(estudiantes);
  27. cout<<"Buscar alumno, ingrese LU: ";cin>>codigoBuscado;
  28. borrar(estudiantes,codigoBuscado);
  29. system("pause");
  30. }
  31.  
  32. void carga(talumno &a)
  33. {
  34. fflush(stdin);
  35. cout<<"Ingrese LU: ";cin>>a.libreta;
  36. fflush(stdin);
  37. cout<<"Ingrese nombre: ";gets(a.nombre);
  38. fflush(stdin);
  39. cout<<"Ingrese carrera: ";gets(a.carrera);
  40. fflush(stdin);
  41. }
  42.  
  43. void cargar_alumnos(parchivo alumnos)
  44. {
  45. talumno a;
  46. int cantidad;
  47. alumnos=fopen("alumnos.txt","wb");//Modo escritura, se pierde el contenido, si no existe el archivo lo crea
  48. cout<<"Cuantos registros desea guardar?: ";cin>>cantidad;
  49. while(cantidad>0){
  50. carga(a);
  51. if(consulta(alumnos,a.libreta)==false){
  52. fwrite(&a,sizeof(a),1,alumnos);
  53. cantidad--;
  54. }
  55. else{
  56. cout<<"YA EXISTE UN USUARIO CON LA MISMA LIBRETA"<<endl;
  57. }
  58. }
  59. fclose(alumnos);
  60. }
  61.  
  62. void mostrar(parchivo alumnos)
  63. {
  64. talumno a;
  65. alumnos=fopen("alumnos.txt","rb");//Apertura solo modo escritura
  66. if(alumnos==NULL){
  67. cout<<"Archivo inexistente"<<endl;
  68. }
  69. else{
  70. while(!feof(alumnos)){
  71. fread(&a,sizeof(a),1,alumnos);
  72. if(!feof(alumnos)){
  73. cout<<a.libreta<<endl;
  74. cout<<a.nombre<<endl;
  75. cout<<a.carrera<<endl;
  76. }
  77. }
  78. }
  79. fclose(alumnos);
  80. }
  81.  
  82. void borrar(parchivo alumnos, int buscado)//Copia todos los alumnos excepto uno en especifico y lo guarda en otro archivo temporal
  83. {
  84. talumno a;
  85. parchivo aux;
  86. alumnos=fopen("alumnos.txt","rb");
  87. aux=fopen("temporal.txt","wb");
  88. if(alumnos!=NULL){
  89. while(!feof(alumnos)){
  90. fread(&a,sizeof(a),1,alumnos);
  91. if(a.libreta!=buscado && !feof(alumnos)){
  92. fwrite(&a,sizeof(a),1,aux);
  93. }
  94. }
  95. fclose(aux);
  96. fclose(alumnos);
  97. }
  98. if(remove("alumnos.txt")==0){//Desde aqui borra el archivo original y renombra el archivo temporal a "alumnos.txt"
  99. cout<<"ELIMINADO EXITOSAMENTE"<<endl;
  100. if(rename("temporal.txt","alumnos.txt")==0){
  101. cout<<"RENOMBRADO EXITOSAMENTE"<<endl;
  102. }
  103. else{
  104. cout<<"ERROR AL RENOMBRAR"<<endl;
  105. }
  106. }
  107. else{
  108. cout<<"ERROR AL ELIMINAR"<<endl;
  109. }
  110. }
  111.  
  112. bool consulta(parchivo alumnos, int codigo)
  113. {
  114. talumno a;
  115. bool existe=false;
  116. alumnos=fopen("alumnos.txt","rb");
  117. if(alumnos!=NULL){
  118. while(!feof(alumnos) && existe==false){
  119. fread(&a,sizeof(a),1,alumnos);
  120. if(a.libreta==codigo){
  121. existe=true;
  122. }
  123. }
  124. }
  125. fclose(alumnos);
  126. return existe;
  127. }


« Última modificación: 5 Octubre 2018, 18:24 por Beginner Web » En línea

Código
  1. # Programador: Ana Kéldysh
  2. # Nacionalidad: Rusia
  3. # Edad: 14 años
  4. #!/bin/bash
  5. echo Hola
Código
  1. void como_la_realidad(short vida)
  2. {
  3. if(vida<=1)
  4. cout << "Entrando en el sueño";
  5. else{
  6. como_la_realidad(vida-1);
  7. cout << " del sueño";
  8. }
  9. }
Código
  1. System.out.println("La vida solo puede comprenderse al réves, pero debe vivirse hacia adelante");
OmarHack


Desconectado Desconectado

Mensajes: 1.269


Ver Perfil
Re: Archivos binarios
« Respuesta #1 en: 5 Octubre 2018, 13:52 »

Si me indicas lo siguiente te ayudo:
Cual es la parte del código que te da problemas?
Qué problemas te da?
Que quieres que haga esa parte de código que no hace?

Es que no tengo ningún compilador a mano en este sistema.


En línea

I like to test things.
NEBIRE


Desconectado Desconectado

Mensajes: 1.458


Ver Perfil
Re: Archivos binarios
« Respuesta #2 en: 5 Octubre 2018, 16:24 »

Debes intentar aprender a atrapar tu mismo los errores sencillos...
Por ejemplo, si ya has introducido un código (por ejemplo 56), repite más tarde el mismo código a ver si lo hace bien, si lo hac emal y lo añade, entonces te vas primero a la parte d ela función que búsqueda que compara el solicitado con el existente, es decir aquí:

Código
  1. while(!feof(alumnos) && existe==false){
  2. fread(&a,sizeof(a),1,alumnos);
  3.                        // imprimir s.libreta y codigo
  4. if(a.libreta==codigo){
  5. existe=true;
  6. }
  7.                        // en la misma línea, imprimir el resultadod e la comparación (el valor de existe)
  8. }
  9.  
He añadido dos líneas comentadas, sustitúyelas por el código correspondiente.... y entonces podrás ver qué pasa, primero viendo si los valores de libreta corresponden con los que has introducido previamente y segundo viendo si el nuevo 'código', se corresponde con el pasado a la función... si ambos son iguales,  la comparación debe arrojar true, si no es así, o los valores no corresponden con los introducidos, tendrás un erro en alguna sección previa.

Y de paso aprovecho para comentarte que no es buena idea que una función se llame existe y dentro (privada) de ella declares una variable con el mismo nombre, se presta a copnfusión, salvo que hayas agotado todos los nombres posibles (imposible verdad?), porque otorgarle el mismo nombre... siendo privado, cambialo por ejemplo por 'bool hallado=false;' significa lo mismo, pero quien lea (otro que no seas tú, no precisan perder más tiempo en verificaciones innecesarias).

...pero vamos, la idea es que aprendas a colocar líneas de código dentro del código, con el único propósito de detectar tus propios errores... una vez detectado, dichas líneas las comentas y cuando lo des por terminado, si quieres hasta puedes borrarlas...
En línea

Beginner Web

Desconectado Desconectado

Mensajes: 186


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Archivos binarios
« Respuesta #3 en: 5 Octubre 2018, 17:57 »

Bueno la funcion consulta no me esta retornando valores validos, en un momento mi codigo retornaba puros 0 ahora retorna puros 1
En línea

Código
  1. # Programador: Ana Kéldysh
  2. # Nacionalidad: Rusia
  3. # Edad: 14 años
  4. #!/bin/bash
  5. echo Hola
Código
  1. void como_la_realidad(short vida)
  2. {
  3. if(vida<=1)
  4. cout << "Entrando en el sueño";
  5. else{
  6. como_la_realidad(vida-1);
  7. cout << " del sueño";
  8. }
  9. }
Código
  1. System.out.println("La vida solo puede comprenderse al réves, pero debe vivirse hacia adelante");
OmarHack


Desconectado Desconectado

Mensajes: 1.269


Ver Perfil
Re: Archivos binarios
« Respuesta #4 en: 5 Octubre 2018, 18:18 »

Cual es la función consulta? No la veo.
En línea

I like to test things.
Beginner Web

Desconectado Desconectado

Mensajes: 186


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Archivos binarios
« Respuesta #5 en: 5 Octubre 2018, 18:59 »

NEBIRE, solo me lee el primer elemento del archivo los demas no, esta bien el recorrido o tengo que hacer otro especial para archivos binarios?
En línea

Código
  1. # Programador: Ana Kéldysh
  2. # Nacionalidad: Rusia
  3. # Edad: 14 años
  4. #!/bin/bash
  5. echo Hola
Código
  1. void como_la_realidad(short vida)
  2. {
  3. if(vida<=1)
  4. cout << "Entrando en el sueño";
  5. else{
  6. como_la_realidad(vida-1);
  7. cout << " del sueño";
  8. }
  9. }
Código
  1. System.out.println("La vida solo puede comprenderse al réves, pero debe vivirse hacia adelante");
Beginner Web

Desconectado Desconectado

Mensajes: 186


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Archivos binarios
« Respuesta #6 en: 5 Octubre 2018, 23:26 »

Bueno, ya encontre el error no era lo que decian por aca, ahora quiero que los que piensen sean ustedes, no hace falta que me digan como arreglar el error, como mucho se puede decir la linea donde esta el error nada mas(faltan dos funciones, o sea 2 lineas de codigo)  ;-)
En línea

Código
  1. # Programador: Ana Kéldysh
  2. # Nacionalidad: Rusia
  3. # Edad: 14 años
  4. #!/bin/bash
  5. echo Hola
Código
  1. void como_la_realidad(short vida)
  2. {
  3. if(vida<=1)
  4. cout << "Entrando en el sueño";
  5. else{
  6. como_la_realidad(vida-1);
  7. cout << " del sueño";
  8. }
  9. }
Código
  1. System.out.println("La vida solo puede comprenderse al réves, pero debe vivirse hacia adelante");
OmarHack


Desconectado Desconectado

Mensajes: 1.269


Ver Perfil
Re: Archivos binarios
« Respuesta #7 en: 5 Octubre 2018, 23:32 »

No me gusta mirar el código de los demás. Soy muy obsesivo con el orden, formato y limpieza en estas cosas.
En línea

I like to test things.
MAFUS


Desconectado Desconectado

Mensajes: 1.325



Ver Perfil
Re: Archivos binarios
« Respuesta #8 en: 6 Octubre 2018, 09:38 »

Ahora la segunda parte.
Ahora que ya te desenvuelves bien con la programación debes pasar a las buenas costumbres:

Toda función debe tener el tipo devuelto en su definición o declaración:
main() {
...
Está mal, es un estándar pre ansietat de hace treinta años.

No uses typedef para ocultar cosas: FILE todos sabemos que es y que esperar cuando lo vemos, parchivo no. Sigue usando FILE.
De igual modo no ocultes punteros: uno ve un puntero y sabe a qué atenerse, si no está el puntero ¿Se trata de una variable normal? Fíjate que las librerías estándar no lo ocultan y en C++ implementaron el paso por referencia para hacer el cometido.

Sí usas C++ lleva todo lo posible a ese lenguaje: por ejemplo ya no uses más typedef tcad[50], en su lugar tienes los strings que hacen la misma función, o mejor. Con los archivos igual.

Estás mezclando C, C++, estilos de hace 30 años. Es hora de centrarte en C++ y sacarle todo el provecho.
En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
Beginner Web

Desconectado Desconectado

Mensajes: 186


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Archivos binarios
« Respuesta #9 en: 6 Octubre 2018, 12:09 »

Esta bien MAFUS, quiero agarrar la logica primero luego me centrare en eso, ademas asi nos estan ennseñando en el secundario, voy a primer año  ;-)
En línea

Código
  1. # Programador: Ana Kéldysh
  2. # Nacionalidad: Rusia
  3. # Edad: 14 años
  4. #!/bin/bash
  5. echo Hola
Código
  1. void como_la_realidad(short vida)
  2. {
  3. if(vida<=1)
  4. cout << "Entrando en el sueño";
  5. else{
  6. como_la_realidad(vida-1);
  7. cout << " del sueño";
  8. }
  9. }
Código
  1. System.out.println("La vida solo puede comprenderse al réves, pero debe vivirse hacia adelante");
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Archivos binarios en VB6???
Programación Visual Basic
Bb-7 1 2,159 Último mensaje 10 Abril 2008, 17:26
por krackwar
Archivos Binarios
Programación Visual Basic
TheGhost(Z) 0 892 Último mensaje 21 Agosto 2010, 16:24
por TheGhost(Z)
archivos binarios
Programación C/C++
marcico 0 541 Último mensaje 26 Julio 2012, 14:14
por marcico
[?] Archivos Binarios
Programación C/C++
MeCraniDOS 3 1,363 Último mensaje 20 Octubre 2013, 15:05
por rir3760
Archivos bINARIOS c++ « 1 2 »
Programación C/C++
SojatDotar 11 1,660 Último mensaje 9 Febrero 2016, 16:36
por SojatDotar
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines