Manejo de Archivos - PROBLEMA!!!

Iniciado por clodan, 14 Octubre 2010, 15:47 PM

0 Miembros y 1 Visitante están viendo este tema.

clodan

Bueno, este es el codigo que tengo:

#include <stdio.h>
#include <stdlib.h>

struct sis{
       int cod;
       char titu[25];
       char aut[25];
       char edit[25];
       int ano;
       char gene[25];
       };

int agregar();
int ver();

char * prog="DATA.file";
FILE * pf = NULL;

struct sis base[3000]={0};

int main(int argc, char *argv[]){
 
  int x;
  pf = fopen( prog, "a+b");
  if (pf==NULL){
        printf("Error al Crear, Abrir o Modificar el Archivo");
        while (getchar()!='\n');
        return 0;
        }
  printf("DATA.file abierto.\n");
  printf("Leyendo Datos de DATA.file. Por favor espere...\n\n");
  while (!feof(pf)){
        fread(&base, sizeof(base), 1, pf);
        }
 
 
 
  printf("....Sistema Interno....\n\n");
  printf("Eliga la opcion que desea realizar:\n");
  printf("1.Agregar Libro Nuevo\n");
  printf("2.Ver Libros Actuales\n");
  scanf("%d",&x);
  switch (x){
         case 1:{
            agregar();
            break;
         }
         case 2:{
            ver();
            break;
         }
  }
 
  fclose(pf);
  system("PAUSE");
  return 0;
}

int agregar(){
    int z=0,y=0;
    if (base[z].cod==0){
       y=z;
       }
    else {
       z++;
       }
   
    base[y].cod=y+1;   
    printf("Ingrese el Titulo del Libro\n");
    scanf("%s",&base[y].titu);
    printf("Ingrese el Autor del Libro\n");
    scanf("%s",&base[y].aut);
    printf("Ingrese la Editorial del Libro\n");
    scanf("%s",&base[y].edit);
    printf("Ingrese el ano del Libro\n");
    scanf("%d",&base[y].ano);
    printf("Ingrese el genero del Libro\n");
    scanf("%d",&base[y].gene);
   
    fwrite (base, 1 , sizeof(base) , pf );
   
    system("PAUSE");
    return 0;
    }

int ver(){
    int i=0;
    int z=0,y=0;
    if (base[z].cod==0){
       y=z;
       }
    else {
       z++;
       }
       
    for (i=0; i<=y; i++){
    printf("%d \t %s \t %s \t %s \t %d \t %s\n",base[i].cod,base[i].titu,base[i].aut,base[i].edit,base[i].ano,base[i].gene );
    }
   
    return 0;
    }



El gran problema, es qe me sobreescribe la informacion que ya esta en el archivo, osea... lo que necesito es...

que lea los datos del archivo y los meta en el struct BASE. Despues, cuando se desea hacer algo, que el programa vea cual es el ultimo registro, y agregue algo despues de ese. Finalmente que lo guarde en el archivo sobreescribiendo lo anterior.

Lo que sucede es que abre el archivo, lo lee, pero cuando escribe, me escribe arriba de lo que ya estaba antes :s

Horricreu

#1
Puedes usar la función fseek() de la librería stdio.h.

clodan

#2
MODIFICACION

Ya solucione el problema que tenia, ahora el problema que tengo es que me muestra 2 veces la ultima informacion guardada  >:(

#include <stdio.h>
#include <stdlib.h>

typedef struct{
       int cod;
       char titu[25];
       char aut[25];
       char edit[25];
       int ano;
       char gene[25];
       }sis;
int agregar();
int ver();
char * prog="DATA.file";
FILE * pf = NULL;
sis base;
int main(int argc, char *argv[]){
  int x;
  pf = fopen( prog, "a+b");
  if (pf==NULL){
        printf("Error al Crear, Abrir o Modificar el Archivo");
        while (getchar()!='\n');
        return 0;
        }
  printf("DATA.file abierto.\n");
  printf("Leyendo Datos de DATA.file. Por favor espere...\n\n");
  while (!feof(pf)){
        fread(&base, sizeof(sis), 1, pf);
  }
  printf("....Sistema Interno....\n\n");
  printf("Eliga la opcion que desea realizar:\n");
  printf("1.Agregar Libro Nuevo\n");
  printf("2.Ver Libros Actuales\n");
  scanf("%d",&x);
  switch (x){
         case 1:{
            agregar();
            break;
         }
         case 2:{
            ver();
            break;
         }
  }
  fclose(pf);
  fflush(stdin);
  while (getchar()!='\n');
  return 0;
}

int agregar(){
     
    printf("Ingrese el Titulo del Libro\n");
    fflush(stdin);
    gets(base.titu);
    printf("Ingrese el Autor del Libro\n");
    fflush(stdin);
    gets(base.aut);
    printf("Ingrese la Editorial del Libro\n");
    fflush(stdin);
    gets(base.edit);
    printf("Ingrese el ano del Libro\n");
    fflush(stdin);
    scanf("%d",&base.ano);
    printf("Ingrese el genero del Libro\n");
    fflush(stdin);
    gets(base.gene);
   
    fwrite (&base, 1, sizeof(sis), pf);
return 0;
}

int ver(){
    rewind(pf);
    while (!feof(pf)){
          fread(&base, sizeof(sis), 1, pf);
          printf("%d - %s - %s - %s - %d - %s\n",base.cod,base.titu,base.aut,base.edit,base.ano,base.gene );
    }
   
return 0;
}

Horricreu

#3
Cambia el while() por un if() y verás como funciona.