modificar una estructura de un fichero

suriken
14 de Mayo del 2005
Hola.
Estoy haciendo un programa que permita incluir el nif y el nombre en un fichero
binario. Lo que tengo que hacer es que puedas buscar un nif dentro del fichero
y modificar su nombre.

Lo que he pensado es que al introducir el nif este lo busque dentro del fichero
y cuando lo encuentre devuelva la posicion y escribir el nuevo nombre ahi, pero
me da un error de escritura.
¿Hay alguna orden que me permita modificar la estructura guardada o algo parecido?

El codigo que hice:

con= buscar(n, reg);
if(con!=-1){
fseek(pf, (long)(con)*sizeof(registro), SEEK_SET);
if(fwrite(&reg, sizeof(registro),1,pf)!=1){
printf("nError de escrituran");
}
}
//con, llama a la funcion buscar y devuelve la posicion del registro que se desea modificar, o -1 si no lo encuentra.

Gracias.




josecode
14 de Mayo del 2005
HOLA, este codigo me funciona bien en visual c sin "_O_BINARY" me funcionava en borlan pero no en visual c, los registros "bufff" son una estrustura que contine arrais, enteros y decimales.

int file;
file = open(archivo,O_RDWR | _O_BINARY);
if(lseek(file,posi*FICHAMIDE,0)==-1)
{close(file); return 0; };
_write(file,bufff,FICHAMIDE);

pitukilloloco
14 de Mayo del 2005
Te paso un ejemplo completo de como modificar un archivo binario. Este programa funciona en modo consola y lo puedes compilar con Turbo C, Visual C++ y Dev C++. Hasta luego y suerte.
#include <stdio.h>
#include <conio.h>

struct alumno {
char nombre[80];
int clave;
} alumnos[] = {
"Juan", 1,
"Sara", 2,
"Pepe", 3,
"Ana", 4,
"Pancho", 5,
"Eva", 6,
"Memo", 7,
"Leti", 8,
"Beto", 9,
"Mary", 10
};
char nomarch[] = "alumnos.b";

void MuestraAlumnos ()
{
int i;
for (i = 0; i < sizeof (alumnos) / sizeof (struct alumno); i++)
printf ("%dt%sn", alumnos[i].clave, alumnos[i].nombre);
}

void GuardaAlumnos ()
{
FILE *fp;
int i;
fp = fopen (nomarch, "wb");
for (i = 0; i < sizeof (alumnos) / sizeof (struct alumno); i++)
fwrite (&alumnos[i], sizeof (struct alumno), 1, fp);
fclose (fp);
}

void LeeArchAlumnos ()
{
struct alumno a;
FILE *fp;
fp = fopen (nomarch, "rb");
while (1) {
fread (&a, sizeof (struct alumno), 1, fp);
if (feof (fp))
break;
printf ("%dt%sn", a.clave, a.nombre);
}
fclose (fp);
}

void ModificaAlumno (char *nombre, int clave)
{
struct alumno a;
FILE *fp;
fp = fopen (nomarch, "r+b");
while (1) {
fread (&a, sizeof (struct alumno), 1, fp);
if (feof (fp))
break;
if (!strcmp (nombre, a.nombre)) {
a.clave = clave;
fseek (fp, -1L * sizeof (struct alumno), SEEK_CUR);
fwrite (&a, sizeof (struct alumno), 1, fp);
break;
}
}
fclose (fp);
}

main ()
{
printf ("Muestra alumnos desde la memoria:n");
MuestraAlumnos ();
printf ("nPresione cualquier tecla para continuar..."); getch (); printf ("n");
GuardaAlumnos ();
printf ("Muestra alumnos desde archivo:n");
LeeArchAlumnos ();
printf ("nPresione cualquier tecla para continuar..."); getch (); printf ("n");
ModificaAlumno ("Sara", 12);

ModificaAlumno ("Ana", 14);
ModificaAlumno ("Eva", 16);
ModificaAlumno ("Leti", 18);
ModificaAlumno ("Mary", 20);

printf ("Muestra alumnos modificados desde archivo:n");
LeeArchAlumnos ();
getch ();
}

suriken
14 de Mayo del 2005
Buenas.

Pues mira que no lo consigo, he probado tu programa y va perfectamente pero cuando lo pongo en el mio para que haga lo mismo, me da un error de escritura. Nose, luego seguire porbando a ver si sale.

Gracias

josecode
14 de Mayo del 2005
mira si el fichero esta protegido contra escritura.

suriken
14 de Mayo del 2005
Ya funciona. Me habia dejado algo de lo que tenia antes por ahi y seguia fallando, pero ahora los reescribe bien.


suriken
14 de Mayo del 2005
¿Saben como poder hacer una ordenacion con memoria dinamica?
Es decir, ahora necesito poder ordenar los registros del fichero por el nombre de los que esten dentro, pero sobre la memoria dinamica la verdad es que no entiendo nada.
Pone: Se ha de utilizar una matriz dinamica de registros.

Gracias.