es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo actualizar un archivo de texto estructurado línea por línea.

Mi código almacena todos los detalles de las actividades en un archivo y tengo problemas para acceder a los datos de ese archivo buscando por ID. Esta es mi función de agregar actividades y estructura.

//struct for activities
struct activities{
    char id[5];
    char actName[200];
    char date[20];
    char day[20];
}act;
//function to add volunteering activities
void addAct(){
    FILE *fileAct;

    //prompt user to enter activities details
    printf("\n\t Planning Volunteering Activities");
    printf("\n\t -----------------------------------");
    printf("\n\t Program ID \t: ");
    scanf(" %[^\n]%*c", &act.id);
    printf("\t Name of Activity : ");
    scanf(" %[^\n]%*c", &act.actName);
    printf("\t Date \t\t: ");
    scanf(" %[^\n]%*c", &act.date);
    printf("\t Day \t\t: ");
    scanf(" %[^\n]%*c", &act.day);

    //create & write in file activity
    fileAct = fopen("Activity", "a");

    fprintf(fileAct, "\n\t %s \n", act.id);
    fprintf(fileAct, "1. Name of Activity : %s \n", act.actName);
    fprintf(fileAct, "2. Date : %s \n", act.date);
    fprintf(fileAct, "3. Day : %s \n", act.day);

    //close file activity
    fclose(fileAct);
}

Y esta es mi función de actualización.

//function to update activities
void updateAct(){
    //variable declaration
    char progID[5];

    //open activity file
    FILE *fp = fopen ("Activity", "r");

    //prompt user to search activities to update
    printf("\t Search by Program ID : ");
    scanf(" %[^\n]%*c", &progID);

    while( !feof(fp)){
        fread (&act, sizeof(struct activities), 1, fp);

        if (strcmp(progID, act.id) == 0)
            printf("%s %s", act.id, act.actName);
    }
    fclose(fp);
}

En la función de actualización anterior, no pude acceder a act.id en la estructura basándome en la búsqueda del usuario, en su lugar, el programa muestra todos los datos del archivo. ¿Cómo puedo solucionar este problema?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el problema de mostrar todos los datos en el archivo en lugar de acceder solo a la actividad con el ID correspondiente ingresado por el usuario, puedes modificar la función de actualización de la siguiente manera:

    void updateAct(){
        //declaración de variables
        char progID[5];
    
        //abrir el archivo de actividades para lectura
        FILE *fp = fopen("Actividad", "r");
        //verificar si el archivo se abrió correctamente
        if(fp == NULL){
            printf("Error al abrir el archivo.");
            return;
        }
    
        //solicitar al usuario que busque actividades para actualizar
        printf("\nBuscar por ID de Programa: ");
        scanf("%s", progID);
    
        while(fread(&act, sizeof(struct actividades), 1, fp)){
            if (strcmp(progID, act.id) == 0)
                printf("\nID: %s \nNombre de la Actividad: %s \nFecha: %s \nDía: %s", 
                act.id, act.actName, act.date, act.day);
        }
    
        //cerrar el archivo de actividades
        fclose(fp);
    }
    

    Aquí, hemos agregado una comprobación de si el archivo se abrió correctamente o no. Luego, hemos realizado algunas modificaciones en el bucle while. En lugar de utilizar la función feof(), utilizamos fread() para leer los datos del archivo. Luego, verificamos si el ID ingresado por el usuario coincide con el ID en la estructura. Si coincide, mostramos los detalles de esa actividad en particular. Finalmente, cerramos el archivo.

    Al realizar estos cambios, deberías poder acceder solo a los datos relevantes que coinciden con el ID ingresado por el usuario.

Comments are closed.