Autor
|
Tema: Usos fwrite, fread (Leído 5,592 veces)
|
diegoCmC
Desconectado
Mensajes: 177
|
Hola a todos, estoy siguiendo un manual de programación, y ando con el manejo de ficheros, el problema es que me mandan mejorar un programa que ya he creado y no entiendo las mejoras. En el programa leo los datos del fichero con fgets y fscanf para almacenarlos en el struct, y me mandan leerlos mediante fread y escribirlos con fwrite en lugar de con fprintf, pero no entiendo porque mejora eso el programa A ver si alguien me orienta un poco, pongo el código que tengo hasta ahora, aunque no quiero que nadie implemente el uso de fwrite y fread, solo quiero una explicación Un saludo #include <stdio.h> #include <string.h> struct fecha{ int dia, mes, anio; }; struct{ char nombre[21], direccion[41], email[41]; int telefono; struct fecha nacimiento; }agenda[100]; int main(){ int opcion;//Almacena la opcion elegida en el menu int i=0;//Contador del stuct para saber los datos leidos y escritos int j,k; //Variables auxiliares para los bucles int tipo_busqueda; char cadena_temporal[9], nombre_buscar[20]; //Cadenas auxiliares para leer numeros con gets() FILE* fichero; //Leemos los datos existentes fichero =fopen("agenda.dat", "rt"); if(fichero==NULL){//Si no existe el fichero damos aviso de que lo vamos a crear printf("El fichero aun no existe, asi que se creara\n\n"); } else{ printf("Lectura correcta del fichero\n\n"); while(! feof(fichero )){//Leemos los datos del fichero y los almacenamos en el struct fgets(agenda [i ]. nombre,20,fichero ); //Quitamos los espacios que hay antes de la cadena for(k=0; k<21;k++){ if(agenda[i].nombre[k]!=' '){ j=0; for(;k<21;k++){ agenda[i].nombre[j]=agenda[i].nombre[k]; j++; } } } fgets(agenda [i ]. direccion,40,fichero ); //Quitamos los espacios que hay antes de la cadena for(k=0; k<41;k++){ if(agenda[i].direccion[k]!=' '){ j=0; for(;k<41;k++){ agenda[i].direccion[j]=agenda[i].direccion[k]; j++; } } } fscanf(fichero ,"%9d", &agenda [i ]. telefono); fgets(agenda [i ]. email,40,fichero ); //Quitamos los espacios que hay antes de la cadena for(k=0; k<41;k++){ if(agenda[i].email[k]!=' '){ j=0; for(;k<41;k++){ agenda[i].email[j]=agenda[i].email[k]; j++; } } } fscanf(fichero ,"%d%d%d", &agenda [i ]. nacimiento. dia, &agenda [i ]. nacimiento. mes, &agenda[i].nacimiento.anio); i++; } } //Interactuamos con el usuario do{ //Imprimimos el menu de opciones printf("1. Anadir nuevo dato\n"); printf("2. Visualizar los nombres registrados\n"); printf("3. Mostrar todos los datos de alguien\n"); sscanf(cadena_temporal ,"%1d", &opcion ); if(opcion==1 && i>99){//Si la agenda esta llena no tomara mas datos printf("La agenda ya esta llena\n\n"); } else{//Cuando la agenda no esta llena aun //Creamos un switch con las opciones switch(opcion){ case 1://Añadimos un nuevo dato al struct printf("Introduce el nombre: "); printf("Introduce la direccion: "); gets(agenda [i ]. direccion); printf("Introduce el telefono: "); sscanf(cadena_temporal ,"%9d", &agenda [i ]. telefono); printf("Introduce el e-mail: "); printf("Introduce la fecha de nacimiento\n"); sscanf(cadena_temporal ,"%2d", &agenda [i ]. nacimiento. dia); sscanf(cadena_temporal , "%2d", &agenda [i ]. nacimiento. mes); sscanf(cadena_temporal , "%4d", &agenda [i ]. nacimiento. anio); i++; break; case 2://Mostrar por pantalla los nombres registrados for(j=0; j<i; j++){ } break; case 3://Mostrar todos los datos de alguna persona do{//Busqueda parcial o busqueda completa printf("Busqueda completa(0) o busqueda parcial(1): "); sscanf(cadena_temporal , "%1d", &tipo_busqueda ); if(tipo_busqueda!=0 && tipo_busqueda!=1) printf("La opcion introducida no es correcta\n"); }while(tipo_busqueda!=0 && tipo_busqueda!=1); switch(tipo_busqueda){ case 0://Busqueda completa for(j=0; j<i; j++){ if(strcmp(nombre_buscar ,agenda [j ]. nombre)==0){ printf("Nombre: %s, direccion: %s, Telefono %d\ne-mail: %s, Fecha nacimiento: %d/%d/%d\n\n", agenda[j].nombre, agenda[j].direccion, agenda[j].telefono, agenda[j].email, agenda[j].nacimiento.dia, agenda[j].nacimiento.mes, agenda[j].nacimiento.anio); } } break; case 1://Busqueda parcial for(j=0; j<i; j++){ if(strstr(agenda [j ]. nombre,nombre_buscar )!=NULL ){ printf("Nombre: %s, direccion: %s, Telefono %d\ne-mail: %s, Fecha nacimiento: %d/%d/%d\n\n", agenda[j].nombre, agenda[j].direccion, agenda[j].telefono, agenda[j].email, agenda[j].nacimiento.dia, agenda[j].nacimiento.mes, agenda[j].nacimiento.anio); } } break; default:; } break; case 4://Opcion de salir break; default: printf("La opcion elegida no es correcta\n"); } } }while(opcion!=4); //Guardamos los datos existentes en el fichero de agenda fichero =fopen("agenda.dat", "wt"); for(j=0; j<i; j++){ if(j!=i-1){ fprintf(fichero , "%20s%40s%9d%40s%2d %2d %4d\n", agenda [j ]. nombre, agenda [j ]. direccion, agenda [j ]. telefono, agenda[j].email, agenda[j].nacimiento.dia, agenda[j].nacimiento.mes, agenda[j].nacimiento.anio); } else fprintf(fichero , "%20s%40s%9d%40s%2d %2d %4d", agenda [j ]. nombre, agenda [j ]. direccion, agenda [j ]. telefono, agenda[j].email, agenda[j].nacimiento.dia, agenda[j].nacimiento.mes, agenda[j].nacimiento.anio); } return 0; }
|
|
|
En línea
|
a todas las que me abrieron su coraza traeles suerte ya no creo en el amor pero querria volver a verte
|
|
|
|
DickGumshoe
|
La diferencia es que, si tienes un vector de n elementos, con fprintf tendrías que recorrerlo con un bucle, sin embargo con fwrite indicas el número de elementos a poner en el fichero y listo, ya están guardados. Lo mismo con fread respecto a fscanf. Ejemplo: #include <stdio.h> int main() { int V[13] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; int i; int datos[13]; FILE *fp; fp = fopen("fichero.txt", "w+");for(i =0;i <13;i ++) fprintf(fp , "%d ", V [i ]); //Ponemos en fichero rewind(fp ); //Situamos el cursor al principio del fichero for(i =0;i <13;i ++) fscanf(fp , "%d", &datos [i ]); //Leemos los datos del fichero for(i =0;i <13;i ++) printf("%d ", datos [i ]); //Imprimimos los datos return 0; }
#include <stdio.h> int main() { int V[13] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; int i; int datos[13]; FILE *fp; fp = fopen("fichero.txt", "w+");fwrite(V , sizeof(int), 13, fp ); //Ponemos en fichero rewind(fp ); //Situamos el cursor al principio del fichero fread(datos , sizeof(int), 13, fp ); //Leemos los datos del fichero for(i =0;i <13;i ++) printf("%d ", datos [i ]); //Imprimimos los datos return 0; }
Además, como bien ha dicho el compañero Tremolero, es por seguridad. Intenta meter los datos con fwrite en un fichero *.txt, y verás que no entiendes lo que pone. Pero, sin embargo, al leerlo con fread, sí entenderás su contenido. Un saludo.
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
Hola! no le encuentro sentido al tema de seguridad(nunca lei algo sobre eso), me parece que la ventaja pasa mas por la velocidad al acceder a los datos ya que se trabaja con flujos binarios y el echo de que no se pueda visualizar en un archivo es porque fwrite no le da formato a su salida. La otra ventaja seria la cantidad de lineas de codigo que te ahorras; como ves en el ejemplo de DickGumshoe solo uso una linea para guardar un arreglo y si aplicas fwrite y fread en tu codigo(diegoCmC) vas a ver q el programa se acorta bastante
Saludos
PD: por que pones fgetc antes de los fgets?? para que es??
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
diegoCmC
Desconectado
Mensajes: 177
|
Ponia el fgetc por las dimensiones de la cadena, ya que si guardaba todos los valores se me iba de rango, ya que no dejaba hueco para el \0 que cierra la cadena. La verdad que si se me acorto bastante el codigo. Gracias a todos por las respuestas #include <stdio.h> #include <string.h> struct fecha{//Estructura que almacena una fecha en dia, mes año int dia, mes, anio; }; struct datos{//Estructura que almacena todos los datos char nombre[21], direccion[41], email[41]; int telefono; struct fecha nacimiento; }agenda[100];//Limite de 100, cambiar el numero para ampliarlo void imprimir_menu(void); int seleccionar_opcion(void); int main(){ int opcion;//Almacena la opcion elegida en el menu int i=0;//Contador del stuct para saber los datos leidos y escritos int j,k; //Variables auxiliares para los bucles int tipo_busqueda; char cadena_temporal[9], nombre_buscar[20]; //Cadenas auxiliares para leer numeros con gets() FILE* fichero; //Leemos los datos existentes fichero =fopen("agenda.dat", "rb"); if(fichero==NULL){//Si no existe el fichero damos aviso de que lo vamos a crear printf("El fichero aun no existe, asi que se creara\n\n"); } else{ printf("Lectura correcta del fichero\n\n"); while(! feof(fichero )){//Leemos los datos del fichero y los almacenamos en el struct fread(&agenda [i ],1,sizeof(struct datos ),fichero ); i++; } } //Interactuamos con el usuario do{ imprimir_menu(); opcion=seleccionar_opcion(); if(opcion==1 && i>99){//Si la agenda esta llena no tomara mas datos printf("La agenda ya esta llena\n\n"); } else{//Cuando la agenda no esta llena aun //Creamos un switch con las opciones switch(opcion){ case 1://Añadimos un nuevo dato al struct printf("Introduce el nombre: "); printf("Introduce la direccion: "); gets(agenda [i ]. direccion); printf("Introduce el telefono: "); sscanf(cadena_temporal ,"%9d", &agenda [i ]. telefono); printf("Introduce el e-mail: "); printf("Introduce la fecha de nacimiento\n"); sscanf(cadena_temporal ,"%2d", &agenda [i ]. nacimiento. dia); sscanf(cadena_temporal , "%2d", &agenda [i ]. nacimiento. mes); sscanf(cadena_temporal , "%4d", &agenda [i ]. nacimiento. anio); i++; break; case 2://Mostrar por pantalla los nombres registrados for(j=0; j<i; j++){ } break; case 3://Mostrar todos los datos de alguna persona do{//Busqueda parcial o busqueda completa printf("Busqueda completa(0) o busqueda parcial(1): "); sscanf(cadena_temporal , "%1d", &tipo_busqueda ); if(tipo_busqueda!=0 && tipo_busqueda!=1) printf("La opcion introducida no es correcta\n"); }while(tipo_busqueda!=0 && tipo_busqueda!=1); switch(tipo_busqueda){ case 0://Busqueda completa for(j=0; j<i; j++){ if(strcmp(nombre_buscar ,agenda [j ]. nombre)==0){ printf("Nombre: %s, direccion: %s, Telefono %d\ne-mail: %s, Fecha nacimiento: %d/%d/%d\n\n", agenda[j].nombre, agenda[j].direccion, agenda[j].telefono, agenda[j].email, agenda[j].nacimiento.dia, agenda[j].nacimiento.mes, agenda[j].nacimiento.anio); } } break; case 1://Busqueda parcial for(j=0; j<i; j++){ if(strstr(agenda [j ]. nombre,nombre_buscar )!=NULL ){ printf("Nombre: %s, direccion: %s, Telefono %d\ne-mail: %s, Fecha nacimiento: %d/%d/%d\n\n", agenda[j].nombre, agenda[j].direccion, agenda[j].telefono, agenda[j].email, agenda[j].nacimiento.dia, agenda[j].nacimiento.mes, agenda[j].nacimiento.anio); } } break; default:; } break; case 4://Opcion de salir break; default: printf("La opcion elegida no es correcta\n"); } } }while(opcion!=4); //Guardamos los datos existentes en el fichero de agenda fichero =fopen("agenda.dat", "wb"); for(j=0; j<i-1; j++){ fwrite(&agenda [j ],sizeof(struct datos ),1,fichero ); } return 0; } void imprimir_menu(void){ //Imprimimos el menu de opciones printf("1. Anadir nuevo dato\n"); printf("2. Visualizar los nombres registrados\n"); printf("3. Mostrar todos los datos de alguien\n"); } int seleccionar_opcion(void){ int opcion; char cadena_temporal[2]; sscanf(cadena_temporal ,"%1d", &opcion ); if(opcion!=1 && opcion!=2 && opcion!=3 && opcion!=4){ printf("La opcion elegida no es correcta\n\n"); seleccionar_opcion(); } return opcion; }
|
|
|
En línea
|
a todas las que me abrieron su coraza traeles suerte ya no creo en el amor pero querria volver a verte
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
ayuda fread
« 1 2 »
Programación C/C++
|
Gr1nD3r
|
10
|
6,217
|
29 Julio 2010, 21:20 pm
por Horricreu
|
|
|
Duda con fread
Programación C/C++
|
Gr1nD3r
|
1
|
2,616
|
10 Agosto 2010, 21:24 pm
por Littlehorse
|
|
|
fread y fwrite con clases
Programación C/C++
|
newone
|
4
|
4,888
|
23 Junio 2011, 23:40 pm
por newone
|
|
|
Problema Fwrite
Programación C/C++
|
kristian_5
|
2
|
2,664
|
12 Junio 2013, 11:08 am
por aguml
|
|
|
Problema en C con la funcion fread y fwrite
Programación C/C++
|
M01535
|
7
|
6,313
|
1 Abril 2015, 18:05 pm
por rir3760
|
|