modificar una estructura de un fichero
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(®, 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.
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(®, 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.
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);
int file;
file = open(archivo,O_RDWR | _O_BINARY);
if(lseek(file,posi*FICHAMIDE,0)==-1)
{close(file); return 0; };
_write(file,bufff,FICHAMIDE);
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 ();
}
#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 ();
}
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
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
Ya funciona. Me habia dejado algo de lo que tenia antes por ahi y seguia fallando, pero ahora los reescribe bien.
¿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.
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.