Ficheros en C

1 marzo 2007
jralbendin
Pizarra

Volvemos a la carga con los problemas relacionados con la programación en C. En este caso debeis adivinar el contenido del fichero una vez ejecutado cada programa. Para que la respuesta sea completa, hay incluir una explicación convincente.

El fichero original frw.txt contiene el siguiente texto:

abcdefghijklmn 

Caso 1:

#include <stdio.h>

int main()

{ FILE *pf; char c;

pf=fopen("frw.txt","r+b");

fread(&c,sizeof(char),1,pf);

fread(&c,sizeof(char),1,pf);

c='x';

fwrite(&c,sizeof(char),1,pf);

fclose(pf);

return 0;

}

Caso 2:

#include <stdio.h>

int main()

{ FILE *pf; char c;

pf=fopen("frw.txt","r+b");

fread(&c,sizeof(char),1,pf);

fread(&c,sizeof(char),1,pf);

fseek(pf,-1,SEEK_CUR);c='x';

fwrite(&c,sizeof(char),1,pf);

fclose(pf);

return 0;

}

  • #include

    int main()
    Caso 1:

    { FILE *pf; char c;

    pf=fopen(«frw.txt»,»r+b»); //abre el fichero frw.txt

    fread(&c,sizeof(char),1,pf);

    fread(&c,sizeof(char),1,pf); //al leer 2 veces queda aqui ab|c

    c=’x’; //modifica el caracter por una x

    fwrite(&c,sizeof(char),1,pf); //lo guarda en el fichero

    fclose(pf); //cierra el fichero

    return 0;

    }

    Caso 2:

    #include

    int main()

    { FILE *pf; char c;

    pf=fopen(«frw.txt»,»r+b»); //abre el fichero

    fread(&c,sizeof(char),1,pf);

    fread(&c,sizeof(char),1,pf); //al leer 2 veces queda aqui ab|c

    fseek(pf,-1,SEEK_CUR);//fseek,seek cur deja el puntero en el mismo sitio y -1 lo retrasa una posicion a|bc

    c=’x’; //modifica por x el caracter de la posicion que esta

    fwrite(&c,sizeof(char),1,pf); //escribe en el fichero

    fclose(pf); //cierra el fichero

    return 0;

    }

  • En el caso1 , yo llega ha hacer nada, porque tendria q utilizar un fseek como en el segundo caso.

    En el caso2, al utilizar un fseek se posiciona en la tercera posicion osea entre la b y la c, y le resta uno por lo que se queda entre la a y la b, y sobreescribe la b por la x.

  • La tabulación del código ayuda bastante 😉

    Una anotación: se agradecería el uso de nombres de variables más legibles, por ejemplo si tenemos que volcar un fichero en otro se recomendaría escribir FILE*ficheroEntrada; y el de salida FILE*ficheroSalida; no nombres tan abstractos como pf1 o pf2.

    En el código de Idelfonso existe un error muy grave nada mas empezar.

  • Bueno pero si lo que deseo es buscar una cadena de caracteres en un archivo,
    por ejemplo una lista de nombres, y me dan el nombre de una persona que quiero consultar ¿como haria para encontrarlo?

  • //Programa de gestión de fichero secuencial de biblioteca

    #include
    #include
    #include
    #include

    //Declaración de estructuras y registros de forma global.
    //Estructura del fichero maestro y nuevo maestro.
    struct maestro
    {
    int numreg;
    char titulo[25];
    char autor[30];
    char genero[15];
    int numejem;
    };
    struct maestro regmaestro,regnuevomaestro;

    //Estructura de movimiento
    struct movimiento
    {
    int numreg;
    char tipomov;
    char titulo[25];
    char autor[30];
    char genero[15];
    int numejem;
    };
    struct movimiento regmovimiento;

    void creacion_maestro(void);
    void lectura(void);
    void creacion_movimiento(void);
    void actualizacion(void);
    void baja(void);
    void modificacion(void);
    void alta(void);
    void maestro_a_nuevomaestro(void);
    void error_modificacion(void);
    void error_alta(void);

    //Declaración de los ficheros de forma global.
    FILE *biblio;
    FILE *movi;
    FILE *biblio2;

    void main(void)
    {

    int opcion=1;

    while (opcion!=5)
    {
    clrscr();
    printf(«MENU: Fichero Secuencial Biblioteca.nn»);
    printf(«1. Creacion maestro.n»);
    printf(«2. Lectura.n»);
    printf(«3. Creacion movimiento.n»);
    printf(«4. Actualizacion.n»);
    printf(«5. Salida.nn»);
    printf(«Opcion: «);
    fflush(stdin);
    scanf(«%i»,&opcion);

    switch(opcion)
    {
    case 1:
    creacion_maestro();
    break;
    case 2:
    lectura();
    break;
    case 3:
    creacion_movimiento();
    break;
    case 4:
    actualizacion();
    break;
    default:
    break;
    }

    }

    }

    void creacion_maestro(void)
    {

    biblio=fopen(«biblio.dat»,»w»);

    if(biblio==NULL)
    {
    clrscr();
    printf(«nError en la apertura del fichero maestro (biblio.dat)para escritura»);
    getch();
    return;
    }

    clrscr();

    printf(«Numero de registro: «);
    scanf(«%i»,&regmaestro.numreg);
    fflush(stdin);
    while (regmaestro.numreg!=0)
    {
    printf(«Titulo: «);
    gets(regmaestro.titulo);
    printf(«Autor: «);
    gets(regmaestro.autor);
    printf(«Genero: «);
    gets(regmaestro.genero);
    printf(«Numero de ejemplares: «);
    scanf(«%i»,&regmaestro.numejem);
    fwrite(&regmaestro,sizeof(regmaestro),1,biblio);
    printf(«nNumero de registro: «);
    scanf(«%i»,&regmaestro.numreg);
    fflush(stdin);
    }

    fclose(biblio);
    }

    void lectura(void)
    {

    biblio=fopen(«biblio.dat»,»r»);
    if(biblio==NULL)
    {
    clrscr();
    printf(«nError en la apertura del fichero maestro (biblio.dat) para lectura»);
    getch();
    return;
    }

    clrscr();
    printf(«nNUMREG TITULO AUTOR GENERO NUMEJEMn»);
    fread(&regmaestro,sizeof (regmaestro),1,biblio);
    while(!feof(biblio))
    {
    printf(«%3i %-25s %-30s %-15s %3in»,regmaestro.numreg,regmaestro.titulo,regmaestro.autor,regmaestro.genero,regmaestro.numejem);
    fread(&regmaestro,sizeof(regmaestro),1,biblio);
    }
    getch();
    fclose(biblio);

    }

    void creacion_movimiento()
    {
    movi=fopen(«movi.dat»,»w»);
    if(movi==NULL)
    {
    clrscr();
    printf(«nError en la apertura del fichero maestro (movi.dat)para escritura»);
    getch();
    return;
    }

    printf(«Numero de registro: «);
    scanf(«%i»,&regmovimiento.numreg);
    fflush(stdin);
    while (regmovimiento.numreg!=0)
    {
    printf(«Tipo de actualización: «);
    scanf(«%c»,&regmovimiento.tipomov);
    fflush(stdin);
    printf(«Titulo: «);
    gets(regmovimiento.titulo);
    printf(«Autor: «);
    gets(regmovimiento.autor);
    printf(«Genero: «);
    gets(regmovimiento.genero);
    printf(«Numero de ejemplares: «);
    scanf(«%i»,&regmovimiento.numejem);
    fwrite(&regmovimiento,sizeof(regmovimiento),1,movi);
    printf(«nNumero de registro: «);
    scanf(«%i»,&regmovimiento.numreg);
    fflush(stdin);
    }

    fclose(movi);
    }

    void actualizacion(void)
    {

    int error_remove_rename;

    biblio=fopen(«biblio.dat»,»r»);
    movi=fopen(«movi.dat»,»r»);
    biblio2=fopen(«biblio2.dat»,»w»);

    clrscr();

    if(biblio==NULL)
    {
    printf(«Error en la apertura del fichero maestro (biblio.dat)»);
    getch();
    return;
    }

    if(movi==NULL)
    {
    printf(«Error en la apertura del fichero de movimientos (movi.dat)»);
    getch();
    return;
    }

    if(biblio2==NULL)
    {
    printf(«Error en la apertura del fichero maestro (biblio2.dat)»);
    getch();
    return;
    }

    fread(&regmaestro,sizeof(regmaestro),1,biblio);
    fread(&regmovimiento,sizeof(regmovimiento),1,movi);
    while (!feof(biblio) && !feof(movi))
    {
    // claves iguales -> baja o modificación
    if (regmovimiento.numreg==regmaestro.numreg)
    {
    if (regmovimiento.tipomov==’b’)
    baja();
    else if (regmovimiento.tipomov==’m’)
    modificacion();
    else
    {
    error_modificacion();
    }
    }
    // clave registro movimiento mayor que registro maestro ->
    // paso de registro maestro a nuevo maestro
    else if (regmovimiento.numreg > regmaestro.numreg)
    {
    maestro_a_nuevomaestro();
    }
    // clave registro movimiento menor que registro maestro -> alta
    else if (regmovimiento.numreg < regmaestro.numreg)
    {
    if (regmovimiento.tipomov=='a')
    alta();
    else
    {
    error_alta();
    }
    }
    }
    if (!feof(biblio))
    {
    while (!feof(biblio))
    {
    fwrite(&regmaestro,sizeof(regmaestro),1,biblio2);
    fread(&regmaestro,sizeof(regmaestro),1,biblio);
    }
    }

    if (!feof(movi))
    {
    while (!feof(movi))
    {
    if (regmovimiento.tipomov=='a')
    alta();
    else
    {
    error_alta();
    getch();
    return;
    }
    }
    }

    fclose(biblio);
    fclose(movi);
    fclose(biblio2);

    error_remove_rename=remove("biblio.dat");
    if(error_remove_rename!=0)
    {
    printf("nError en el borrado del fichero maestro (biblio.dat).");
    getch();
    }

    error_remove_rename=remove("movi.dat");
    if(error_remove_rename!=0)
    {
    printf("nError en el borrado del fichero de movimientos (movi.dat).");
    getch();
    }

    error_remove_rename=rename("biblio2.dat","biblio.dat");
    if(error_remove_rename!=0)
    {
    printf("nError en el renombrado del fichero nuevo maestro (biblio2.dat)a maestro (biblio.dat).");
    getch();
    }

    }

    void baja(void)
    {
    fread(&regmaestro,sizeof(regmaestro),1,biblio);
    fread(&regmovimiento,sizeof(regmovimiento),1,movi);
    }

    void modificacion(void)
    {
    if (strcmp(regmovimiento.titulo,"")!=0)
    strcpy(regmaestro.titulo,regmovimiento.titulo);
    if (strcmp(regmovimiento.autor,"")!=0)
    strcpy(regmaestro.autor,regmovimiento.autor);
    if (strcmp(regmovimiento.genero,"")!=0)
    strcpy(regmaestro.genero,regmovimiento.genero);
    regmaestro.numejem=regmaestro.numejem+regmovimiento.numejem;
    fwrite(&regmaestro,sizeof(regmaestro),1,biblio2);
    fread(&regmaestro,sizeof(regmaestro),1,biblio);
    fread(&regmovimiento,sizeof(regmovimiento),1,movi);
    }

    void alta(void)
    {
    regnuevomaestro.numreg=regmovimiento.numreg;
    strcpy(regnuevomaestro.titulo,regmovimiento.titulo);
    strcpy(regnuevomaestro.autor,regmovimiento.autor);
    strcpy(regnuevomaestro.genero,regmovimiento.genero);
    regnuevomaestro.numejem=regmovimiento.numejem;
    fwrite(&regnuevomaestro,sizeof(regnuevomaestro),1,biblio2);
    fread(&regmovimiento,sizeof(regmovimiento),1,movi);
    }

    void maestro_a_nuevomaestro(void)
    {
    fwrite(&regmaestro,sizeof(regmaestro),1,biblio2);
    fread(&regmaestro,sizeof(regmaestro),1,biblio);
    }

    void error_modificacion(void)
    {
    printf("nError en modificación. Número de registro: %i",regmovimiento.numreg);
    fread(&regmovimiento,sizeof(regmovimiento),1,movi);
    fread(&regmaestro,sizeof(regmaestro),1,biblio);
    }

    void error_alta(void)
    {
    printf("nError en alta. Número de registro: %i",regmovimiento.numreg);
    fread(&regmovimiento,sizeof(regmovimiento),1,movi);
    }

Los comentarios están cerrados.