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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


  Mostrar Mensajes
Páginas: 1 ... 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [25] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 ... 161
241  Programación / Programación C/C++ / Re: Archivos en C/C++ problemas con valores de retorno en: 3 Enero 2019, 12:28 pm
¿Por qué haces esto?

Código:
docentes=fopen("docentes.txt","ab+");
cargar(d);
fclose(docentes);

Por otra parte y cómo se ha repetido muchas veces: es un error cargar una estructura directamente a un archivo y recuperarla de él totalmente.
C/C++ puede mover los miembros de las estructuras y dejar espacios vacíos entre ellos para que se ajusten en la memoria. En algunas plataformas esto se soluciona serializando estos datos. Pero una forma rápida de resolverlo es grabando en disco miembro a miembro y a la hora de sacarlas leyendo miembro a miembro en el mismo orden.
Si no lo haces de esta forma puede que creas que estas leyendo legajo cuando en realidad estás leyendo nombre_apellidos, por ejemplo.

Me he tomado la libertad de hacerle algunos arreglillos, sobre todo para el tema de que el tamaño teórico de una estructura no es el real y alguna que otra cosa con el manejo de los archivos. Aún así necesita aun muchas mejoras: validar fechas, recibir el tipo de dato esperado desde la consola y toda una larga lista de etcéteras. También lo he pasado a C (C++ no me gusta).

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. #define MAX_CADENA 50
  6.  
  7. typedef struct tfecha {
  8.    int dia;
  9.    int mes;
  10.    int anyo;
  11. } fecha;
  12.  
  13. typedef struct tformacion {
  14.    char titulo[MAX_CADENA];
  15.    char facultad[MAX_CADENA];
  16.    char universidad[MAX_CADENA];
  17. } formacion;
  18.  
  19. typedef struct tdocente {
  20.    int legajo;
  21.    char nombre_apellido[MAX_CADENA];
  22.    fecha fecha_nac;
  23.    formacion educacion;
  24.    int DNI;
  25.    char cargo[MAX_CADENA];
  26. } docente;
  27.  
  28. void grabar_registro(docente *registro, FILE *archivo);
  29. void leer_registro(docente *registro, FILE *archivo);
  30. void cargar(docente *individuo);
  31. void mostrar(docente *individuo);
  32. void cargar_docentes(char * const nombre_archivo);
  33. bool consulta(char * const nombre_archivo, int codigo);
  34. void mostrar_docentes(char * const nombre_archivo);
  35. void busqueda(char * const nombre_archivo, int codigo);
  36. void modificar_docente(char * const nombre_archivo, int codigo);
  37. void eliminar_docente(char * const nombre_archivo, int codigo);
  38. void listar_docentes_especificos(char * const nombre_archivo, char * const buscado);
  39. void nueva_cadena(char cadena[]);
  40.  
  41. int main() {
  42.    char *docentes = "docentes.txt";
  43.    int opcion, codigo;
  44.    char buscado[MAX_CADENA];
  45.    do {
  46.        system("cls");
  47.        puts("1. Cargar docente");
  48.        puts("2. Consultar docente");
  49.        puts("3. Listar docentes");
  50.        puts("4. Buscar docente");
  51.        puts("5. Modificar docente");
  52.        puts("6. Eliminar docente");
  53.        puts("7. Listar docentes por universidad");
  54.        puts("8. Salir");
  55.        printf("\n> ");
  56.        scanf("%d", &opcion);
  57.        switch(opcion) {
  58.        case 1:
  59.            cargar_docentes(docentes);
  60.            break;
  61.        case 2:
  62.            printf("Ingrese numero de legajo: ");
  63.            scanf("%d", &codigo);
  64.            if(consulta(docentes, codigo))
  65.                puts("Docente encontrado");
  66.            else
  67.                puts("Docente no encontrado");
  68.            break;
  69.        case 3:
  70.            mostrar_docentes(docentes);
  71.            break;
  72.        case 4:
  73.            printf("Ingrese numero de legajo: ");
  74.            scanf("%d", &codigo);
  75.            busqueda(docentes, codigo);
  76.            break;
  77.        case 5:
  78.            printf("Ingrese numero de legajo: ");
  79.            scanf("%d", &codigo);
  80.            modificar_docente(docentes, codigo);
  81.            break;
  82.        case 6:
  83.            printf("Ingrese numero de legajo: ");
  84.            scanf("%d", &codigo);
  85.            eliminar_docente(docentes, codigo);
  86.            break;
  87.        case 7:
  88.            printf("Ingrese universidad: ");
  89.            nueva_cadena(buscado);
  90.            listar_docentes_especificos(docentes, buscado);
  91.            break;
  92.        case 8:
  93.            puts("FIN DEL PROGRAMA");
  94.            break;
  95.        default:
  96.            puts("Opcion incorrecta");
  97.        }
  98.        system("pause");
  99.    } while(opcion!=8);
  100. }
  101.  
  102. void grabar_registro(docente *registro, FILE *archivo) {
  103.    fwrite(&registro->legajo, sizeof(int), 1, archivo);
  104.    fwrite(registro->nombre_apellido, sizeof(char), MAX_CADENA, archivo);
  105.    fwrite(&registro->fecha_nac.dia, sizeof(int), 1, archivo);
  106.    fwrite(&registro->fecha_nac.mes, sizeof(int), 1, archivo);
  107.    fwrite(&registro->fecha_nac.anyo, sizeof(int), 1, archivo);
  108.    fwrite(registro->educacion.titulo, sizeof(char), MAX_CADENA, archivo);
  109.    fwrite(registro->educacion.facultad, sizeof(char), MAX_CADENA, archivo);
  110.    fwrite(registro->educacion.universidad, sizeof(char), MAX_CADENA, archivo);
  111.    fwrite(&registro->DNI, sizeof(int), 1, archivo);
  112.    fwrite(registro->cargo, sizeof(char), MAX_CADENA, archivo);
  113. }
  114.  
  115. void leer_registro(docente *registro, FILE *archivo) {
  116.    fread(&registro->legajo, sizeof(int), 1, archivo);
  117.    fread(registro->nombre_apellido, sizeof(char), MAX_CADENA, archivo);
  118.    fread(&registro->fecha_nac.dia, sizeof(int), 1, archivo);
  119.    fread(&registro->fecha_nac.mes, sizeof(int), 1, archivo);
  120.    fread(&registro->fecha_nac.anyo, sizeof(int), 1, archivo);
  121.    fread(registro->educacion.titulo, sizeof(char), MAX_CADENA, archivo);
  122.    fread(registro->educacion.facultad, sizeof(char), MAX_CADENA, archivo);
  123.    fread(registro->educacion.universidad, sizeof(char), MAX_CADENA, archivo);
  124.    fread(&registro->DNI, sizeof(int), 1, archivo);
  125.    fread(registro->cargo, sizeof(char), MAX_CADENA, archivo);
  126. }
  127.  
  128. void cargar(docente *individuo) {
  129.    puts("Ingrese datos del docente");
  130.    printf("Legajo: ");
  131.    scanf("%d", &individuo->legajo);
  132.    printf("Nombre y apellido: ");
  133.    nueva_cadena(individuo->nombre_apellido);
  134.    puts("Fecha de nacimiento...");
  135.    printf("Dia: ");
  136.    scanf("%d", &individuo->fecha_nac.dia);
  137.    printf("Mes: ");
  138.    scanf("%d", &individuo->fecha_nac.mes);
  139.    printf("Anyo: ");
  140.    scanf("%d", &individuo->fecha_nac.anyo);
  141.    puts("Formacion academica");
  142.    printf("Titulo: ");
  143.    nueva_cadena(individuo->educacion.titulo);
  144.    printf("Facultad: ");
  145.    nueva_cadena(individuo->educacion.facultad);
  146.    printf("Universidad: ");
  147.    nueva_cadena(individuo->educacion.universidad);
  148.    printf("DNI: ");
  149.    scanf("%d", &individuo->DNI);
  150.    printf("Cargo: ");
  151.    nueva_cadena(individuo->cargo);
  152. }
  153.  
  154. void mostrar(docente *individuo) {
  155.    puts("Datos del docente");
  156.    printf("Legajo: %d\n", individuo->legajo);
  157.    printf("Nombre y apellido: %s\n", individuo->nombre_apellido);
  158.    printf("Fecha de nacimiento: %d/%d/%d\n", individuo->fecha_nac.dia, individuo->fecha_nac.mes, individuo->fecha_nac.anyo);
  159.    puts("Formacion academica");
  160.    printf("Titulo: %s\n", individuo->educacion.titulo);
  161.    printf("Facultad: %s\n", individuo->educacion.facultad);
  162.    printf("Universidad: %s\n", individuo->educacion.universidad);
  163.    printf("DNI: %d\n", individuo->DNI);
  164.    printf("Cargo: %s\n\n", individuo->cargo);
  165. }
  166.  
  167. void cargar_docentes(char * const nombre_archivo) {
  168.    docente d;
  169.    FILE *fp;
  170.    cargar(&d);
  171.    if(consulta(nombre_archivo, d.legajo)==false) {
  172.        fp=fopen(nombre_archivo, "ab");
  173.        grabar_registro(&d, fp);
  174.        fclose(fp);
  175.    }
  176.    else
  177.        puts("El numero de legajo ya existe");
  178. }
  179.  
  180. bool consulta(char * const nombre_archivo, int codigo) {
  181.    docente d;
  182.    char c;
  183.    bool encontrado=false;
  184.    FILE *fp=fopen(nombre_archivo,"rb");
  185.    if(fp) {
  186.        c=fgetc(fp);
  187.        while(!feof(fp) && !encontrado) {
  188.            ungetc(c, fp);
  189.            leer_registro(&d, fp);
  190.            if(d.legajo==codigo)
  191.                encontrado=true;
  192.            c=fgetc(fp);
  193.        }
  194.    }
  195.    fclose(fp);
  196.    return encontrado;
  197. }
  198.  
  199. void mostrar_docentes(char * const nombre_archivo) {
  200.    docente d;
  201.    char c;
  202.    FILE *fp=fopen(nombre_archivo, "rb");
  203.    if(!fp) {
  204.        puts("No se pudo abrir el archivo");
  205.        return;
  206.    }
  207.    c=fgetc(fp);
  208.    while(!feof(fp)) {
  209.        ungetc(c, fp);
  210.        leer_registro(&d, fp);
  211.        mostrar(&d);
  212.        c=fgetc(fp);
  213.    }
  214.    fclose(fp);
  215. }
  216.  
  217. void busqueda(char * const nombre_archivo, int codigo) {
  218.    docente d;
  219.    char c;
  220.    bool encontrado=false;
  221.    FILE *fp=fopen(nombre_archivo, "rb");
  222.    if(!fp) {
  223.        puts("No se pudo abrir el archivo");
  224.        return;
  225.    }
  226.    c=fgetc(fp);
  227.    while(!feof(fp) && !encontrado) {
  228.        ungetc(c, fp);
  229.        leer_registro(&d, fp);
  230.        if(d.legajo==codigo) {
  231.            mostrar(&d);
  232.            encontrado=true;
  233.        }
  234.        c=fgetc(fp);
  235.    }
  236.    if(encontrado==false)
  237.        puts("Docente no encontrado");
  238.    fclose(fp);
  239. }
  240.  
  241. void modificar_docente(char * const nombre_archivo, int codigo) {
  242.    docente d;
  243.    char c;
  244.    long int posicion = 0;
  245.    bool encontrado=false;
  246.    FILE *fp=fopen(nombre_archivo, "rb+");
  247.    if(!fp) {
  248.        puts("No se pudo abrir el archivo");
  249.        return;
  250.    }
  251.    c=fgetc(fp);
  252.    while(!feof(fp) && !encontrado) {
  253.        ungetc(c, fp);
  254.        leer_registro(&d, fp);
  255.        if(codigo==d.legajo)
  256.            encontrado=true;
  257.        else
  258.            posicion = ftell(fp);
  259.        c=fgetc(fp);
  260.    }
  261.    if(encontrado) {
  262.        ungetc(c, fp);
  263.        cargar(&d);
  264.        fseek(fp, posicion, SEEK_SET);
  265.        grabar_registro(&d, fp);
  266.    }
  267.    else
  268.        puts("Docente no encontrado");
  269.    fclose(fp);
  270. }
  271.  
  272. void eliminar_docente(char * const nombre_archivo, int codigo) {
  273.    const char *nombre_temporal = "temporal.txt";
  274.    docente d;
  275.    char c;
  276.    FILE *fp;
  277.    FILE *temporal;
  278.    fp=fopen(nombre_archivo, "rb");
  279.    if(!fp) {
  280.        printf("No se puede abrir el archivo %s\n", nombre_archivo);
  281.        return;
  282.    }
  283.    temporal=fopen(nombre_temporal, "wb");
  284.    if(!temporal) {
  285.        puts("No se pudo generar el archivo temporal.");
  286.        fclose(fp);
  287.        return;
  288.    }
  289.    c=fgetc(fp);
  290.    while(!feof(fp)) {
  291.        ungetc(c, fp);
  292.        leer_registro(&d, fp);
  293.        if(!feof(fp) && d.legajo!=codigo)
  294.            grabar_registro(&d, temporal);
  295.        c=fgetc(fp);
  296.    }
  297.    fclose(fp);
  298.    fclose(temporal);
  299.    if(remove(nombre_archivo)==0)
  300.        rename(nombre_temporal, nombre_archivo);
  301.    else
  302.        puts("ERROR AL ELIMINAR");
  303. }
  304.  
  305. void listar_docentes_especificos(char * const nombre_archivo, char * const buscado) {
  306.    docente d;
  307.    char c;
  308.    FILE *fp = fopen(nombre_archivo, "rb");
  309.    if(!fp) {
  310.        puts("No se pudo abrir el archivo");
  311.        return;
  312.    }
  313.    c=fgetc(fp);
  314.    while(!feof(fp)) {
  315.        ungetc(c, fp);
  316.        leer_registro(&d, fp);
  317.        if(strcmp(d.educacion.universidad, buscado)==0)
  318.            mostrar(&d);
  319.        c=fgetc(fp);
  320.    }
  321.    fclose(fp);
  322. }
  323.  
  324. void nueva_cadena(char cadena[]) {
  325.    char *c;
  326.    fseek(stdin, 0, SEEK_END);
  327.    fgets(cadena, MAX_CADENA, stdin);
  328.    c = strchr(cadena, '\n');
  329.    if(c)
  330.        *c = '\0';
  331.    fseek(stdin, 0, SEEK_END);
  332. }
242  Programación / Programación C/C++ / Re: Ayuda, sumatoria de filas y columnas de arreglo en C en: 2 Enero 2019, 21:39 pm
Dónde dices
Código:
for(y=0;y<12;y++)
  acu=acu+arr[x][y];
Debe decir y<11 porque sino también sumarán la propia suma.

Para la suma de las columnas es similar pero en vez de moverte primero por filas y dentro de ellas por columnas, primero debes moverte por columnas y dentro de ellas por filas.
243  Programación / Programación C/C++ / Re: porque aparece Id returned 1 exit status??? en: 2 Enero 2019, 01:17 am
No es un  programa, es la definición de una clase para manejar una lista.
Lo que ves es un fallo del enlazador, le debe faltar algo para terminar de enlazar.
Por otra parte: la líne #include "list" parece que sobra. Se intenta incluir un archivo llamado list, que se encuentra en el mismo directorio que éste. Pero este se debe llamar list.h, así que creo que es un fallo intencionado que os ha introducido el profesor. Quien sabe.
244  Programación / Programación C/C++ / Re: Sobre el truncamiento - Consulta en: 31 Diciembre 2018, 23:01 pm
Puedo intuir qué es Racional, pero ¿Què es exactamente?
245  Programación / Programación C/C++ / Re: Sobre el truncamiento - Consulta en: 31 Diciembre 2018, 17:17 pm
Mete el valor en un double y castea uno de los operandos a double.
246  Programación / Programación C/C++ / Re: [C] Como hacer un buffer FIFO? en: 31 Diciembre 2018, 00:20 am
Crea un array de dimensión conocida el cual tenga dos punteros: lectura, i y ecritura, o.
Genera dos únicas funciones que serán las que trabajaran con ese array: una de lectura y una de escritura.

Función de lectura:
Si el puntero o es igual al puntero i (las posiciones a las que apuntan) el buffer está vacío y deberás informar sobre ello; en caso contrario leerás el carácter que hay en la posición o y lo harás avanzar una posición. Si o queda fuera del array, o pasa a apuntar el principio del array. Devuelves el carácter leído.

La función de escritura:
Guardarás en la posición i el carácter conseguido y compruebas si en la siguiente posición está o. Si lo está avisar de ello, sino avanzar o a la siguiente posición. Por supuesto si la siguiente posición está fuera del array mover i al inicio del array.
247  Programación / Programación C/C++ / Re: Se puede acceder a la memoria de una variable tipo char ? en: 29 Diciembre 2018, 00:13 am
Intenta con
Código:
cout << static_cast<void*>(&vocal);
248  Programación / Programación C/C++ / Re: Borrar nodos pasados por parametro valor/referencia en: 26 Diciembre 2018, 01:07 am
Te paso una pila básica codificada en C. Espero que te sirva.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <locale.h>
  5.  
  6. typedef struct tpila {
  7.    int dato;
  8.    struct tpila *siguiente;
  9. } pila;
  10.  
  11. pila* pila_new() {
  12.    return NULL;
  13. }
  14.  
  15. bool pila_push(pila **top, int dato) {
  16.    bool retValue = false;
  17.    pila *nodo = malloc(sizeof(pila));
  18.  
  19.    if(!nodo)
  20.        goto final_pila_push;
  21.  
  22.    nodo->dato = dato;
  23.    nodo->siguiente = *top;
  24.    *top = nodo;
  25.  
  26.    retValue = true;
  27. final_pila_push:
  28.    return retValue;
  29. }
  30.  
  31. bool pila_pop(pila **top, int *dato) {
  32.    bool retValue = false;
  33.    pila *nodo = *top;
  34.  
  35.    if(!nodo)
  36.        goto final_pila_pop;
  37.  
  38.    *dato = nodo->dato;
  39.    *top = nodo->siguiente;
  40.  
  41.    free(nodo);
  42.  
  43.    retValue = true;
  44. final_pila_pop:
  45.    return retValue;
  46. }
  47.  
  48. bool pila_top(pila ** const top, int *dato) {
  49.    bool retValue = false;
  50.  
  51.    if(!*top)
  52.        goto final_pila_top;
  53.  
  54.    *dato = (*top)->dato;
  55.  
  56.    retValue = true;
  57. final_pila_top:
  58.    return retValue;
  59. }
  60.  
  61. void pila_free(pila **top) {
  62.    pila *nodo;
  63.  
  64.    while(*top) {
  65.        nodo = *top;
  66.        *top = nodo->siguiente;
  67.        free(nodo);
  68.    }
  69. }
  70.  
  71. int main() {
  72.    int n;
  73.    pila *p = pila_new();
  74.  
  75.    setlocale(LC_ALL, "spanish");
  76.  
  77.    pila_push(&p, 5);
  78.    pila_push(&p, 2);
  79.    pila_push(&p, 3);
  80.  
  81.    pila_top(&p, &n);
  82.    printf("En la pila está el valor %d\n", n);
  83.  
  84.    pila_pop(&p, &n);
  85.    printf("Se saca de la pila el valor %d\n", n);
  86.  
  87.    pila_pop(&p, &n);
  88.    printf("Se saca de la pila el valor %d\n", n);
  89.  
  90.    pila_free(&p);
  91. }
249  Programación / Programación C/C++ / Re: Consulta sobre herencia y cómo proceder en: 24 Diciembre 2018, 17:56 pm
La clase instrumento es la que tu has nombrado cómo Piano.

Dentro de main debes crear un objeto piano a partir de instrumento y debe guardar las siete teclas y un pueda. La forma de acceder a teclas y pedal será a partir de piano.
250  Programación / Programación C/C++ / Re: No entiendo este error - Ayuda en: 23 Diciembre 2018, 23:35 pm
Sacando string nom_ape del switch me ha funcionado.
Páginas: 1 ... 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [25] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 ... 161
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines