Ver Mensaje Individual
  #6 (permalink)  
Antiguo 31/03/2015, 09:46
M01535
 
Fecha de Ingreso: marzo-2015
Mensajes: 3
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Problema en C con fread y fwrite

Wow, muchas gracias por tu respuesta y tu tiempo, he estado leyendo con atención lo que me comentaste y a ver te comento un poco algunas cosas...

El Buffer[strlen(Buffer)-1]='\0' lo utilicé porque en el fichero los datos están separados por un salto de linea entonces me interesa quitarlos y luego a la hora de escribir en el struct lo pongo tambien porque fgets me genera un salto de linea.

El ciclo while tienes razón, no iba a fallar jamás, muchas gracias por tu ayuda.

El buffer es cierto que lo pude eliminar de las partes donde leo una string, quedando asi:
Código:
fgets(Datos[X].Name,sizeof(Datos[X].Name),Agenda);
    if(strlen(Datos[X].Name)>0) Datos[X].Name[strlen(Datos[X].Name)-1]='\0';
    if(feof(Agenda)) break;
Pero cuando leo los valores int probé a ponerlo de este modo:
Código:
sscanf(stdin,"%d",&Datos[X].Day);
if(feof(Agenda)) break;
Y no funciona porque al leerlos al principio del programa me los transforma en 0 el dia, mes y año, tanto en el programa como en el fichero, por lo que lo tuve que dejar como estaba, utilizando Buffer:
Código:
fgets(Buffer,200,Agenda);
sscanf(Buffer,"%d",&Datos[X].Day);
if(feof(Agenda)) break;
El desbordamiento de buffer ya lo corregí y la variable Algodon la cambié por la variable X, aunque no la pude eliminar del todo porque posteriormente en el programa tengo que hacer otro uso de la cariable Algodon donde no veo posibilidad de eliminarla.

Muchas gracias por todos tus consejos, rapidez de respuesta y por ayudarme a mejorar como programador, valoro tu tiempo y habilidad.

Ahora bien, la gran duda que me asalta xD, en el momento de leer del fichero y escribir en el finalmente, hago uso de fgets y fprintf, pero lo que tengo que intentar es sustituir esas ordenes por fread y fwrite, lo cual, a pesar de todos mis intentos no he conseguido aun... xD

Y bueno, este es el código de uno de mis intentos inutiles de usar fread y fwrite a la hora de leer y escribir los datos en el fichero:
Código:
#include <stdio.h>
#include <string.h>

int main(){

FILE* Agenda;
struct{
    char Name[100],Adress[100],Email[100],Movil[13];
    unsigned short int Day,Month,Year;
}Datos[100];
char Buffer[200],Buscar[200];
int X=0,Y,Menu,Algodon=0;

//LEER DATOS DEL FICHERO
Agenda=fopen("agenda.dat","rb");
    fread(&Datos,sizeof(Agenda),1,Agenda);
    X++;
fclose(Agenda);
if(X==0){
    printf("No hay datos que leer...\n\n");
}
else{
    printf("Datos leidos...\n\n");
}

do{
    printf("1 - Introducir nuevo dato\n2 - Ver todos los nombres de los datos\n3 - Buscar\n0 - Salir\nQue desea hacer?: ");
    fgets(Buffer,sizeof(Buffer),stdin);
    sscanf(Buffer,"%d",&Menu);

    switch(Menu){
    //INGRESAR NUEVO DATO
    case 1:
    printf("\n\nNUEVO DATO:\nIngrese el nombre: ");
    fgets(Datos[X].Name,sizeof(Datos[X].Name),stdin);
    Datos[X].Name[strlen(Datos[X].Name)-1]='\0';

    printf("Ingrese la ciudad: ");
    fgets(Datos[X].Adress,sizeof(Datos[X].Adress),stdin);
    Datos[X].Adress[strlen(Datos[X].Adress)-1]='\0';

    printf("Ingrese el numero de movil: ");
    fgets(Datos[X].Movil,sizeof(Datos[X].Movil),stdin);
    Datos[X].Movil[strlen(Datos[X].Movil)-1]='\0';

    printf("Ingrese el email: ");
    fgets(Datos[X].Email,sizeof(Datos[X].Email),stdin);
    Datos[X].Email[strlen(Datos[X].Email)-1]='\0';

    printf("Ingrese el dia de nacimiento: ");
    fgets(Buffer,sizeof(Buffer),stdin);
    sscanf(Buffer,"%d",&Datos[X].Day);

    printf("Ingrese el mes de nacimiento: ");
    fgets(Buffer,sizeof(Buffer),stdin);
    sscanf(Buffer,"%d",&Datos[X].Month);

    printf("Ingrese su year de nacimiento: ");
    fgets(Buffer,sizeof(Buffer),stdin);
    sscanf(Buffer,"%d",&Datos[X].Year);
    X++;
    break;

    //MOSTRAR LOS NOMBRES DE TODOS LOS DATOS
    case 2:
        if(X==0){
            printf("\n\nNo hay datos que mostrar\n\n");
            break;
        }

    printf("\n\nEstos son los nombres de todos los datos:\n");
    for(Y=0;Y<X;Y++){
        printf("%d - %s\n",Y,Datos[Y].Name);
    }
    printf("\n");
        break;

    //BUSCAR DATO POR NOMBRE
    case 3:
        printf("\n\nIntroduzca el nombre del contacto que desea buscar: ");
        fgets(Buscar,sizeof(Buscar),stdin);
        Buscar[strlen(Buscar)-1]='\0';
        Algodon=0;

        for(Y=0;Y<X;Y++){
            if(strcmp(Buscar,Datos[Y].Name)==0){
                printf("\nSe ha encontrado este/os resultado/s:\n");
                printf("Name: %s\nAdress: %s\nPhone: %s\nEmail: %s\nBorn in: %d-%d-%d\n\n",Datos[Y].Name,Datos[Y].Adress,Datos[Y].Movil,Datos[Y].Email,Datos[Y].Day,Datos[Y].Month,Datos[Y].Year);
                Algodon=1;
            }
        }
        if(Algodon==0){
            printf("\nNo se han encontrado resultados...\n\n");
        }
    }
}while(Menu!=0);

//ESCRIBIR LOS DATOS EN EL FICHERO
Agenda=fopen("agenda.dat","wb");
fwrite(&Datos,sizeof(Datos),1,Agenda);
fclose(Agenda);

printf("\nSaliendo...");
getchar();
return 0;
}

Última edición por M01535; 31/03/2015 a las 09:52