Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Error con la función fwrite.

Estas en el tema de Error con la función fwrite. en el foro de C/C++ en Foros del Web. Tal vez me puedan dar una mano, estoy haciendo algo parecido como un inventario. Todo funciona perfecto, para al momento de introducir los datos en ...
  #1 (permalink)  
Antiguo 27/08/2010, 15:27
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Error con la función fwrite.

Tal vez me puedan dar una mano, estoy haciendo algo parecido como un inventario. Todo funciona perfecto, para al momento de introducir los datos en el archivo el primero aparece perfecto y los demás en caracteres extraños.

Código C:
Ver original
  1. struct {
  2.     char  producto[20];
  3.     int   codigo;
  4.     float precio;
  5. } inventario;

Código C:
Ver original
  1. void menu(){
  2.     printf("\n\nMenu:\n=====\n\n");
  3.     printf("1.- Agregar a inventario\n");
  4.     printf("2.- Leer inventario\n");
  5.     printf("3.- Salir \n\n");
  6.     printf("Escoge una opcion: ");fflush(stdout);
  7. datos.opcion = getch();
  8. FILE *db;
  9. db = fopen("DB/inventario.db", "wb");
  10. switch (datos.opcion){
  11.     case '1':
  12.     printf("\nCuantos productos deseas agregar: ");
  13.     scanf("%i", &datos.productos);
  14. for (datos.i = 0 ; datos.i < datos.productos ; datos.i++){
  15.     printf("Introduce el nombre del producto: "); fflush(stdout);
  16.     gets(inventario.producto);
  17.     printf("Introduce el codigo del producto: "); fflush(stdout);
  18.     scanf("%i", &inventario.codigo);
  19.     printf("Introduce el precio del producto: "); fflush(stdout);
  20.     scanf("%f", &inventario.precio);
  21.     fwrite(&inventario, sizeof(inventario), 1, db);
  22. }
  23.     fclose (db);
  24. }
  25. }
  #2 (permalink)  
Antiguo 27/08/2010, 15:37
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Error con la función fwrite.

Te esta pasando lo siguiente. Con fwrite copias uno a uno la informacion, osea se copia bits a bits.

Cualquier lector de archivos, lee bytes a bytes (8bits) y muestra un caracter por cada bytes. Es por eso que el nombre se ve bien porque los caracteres ocupan un bytes. En cambia un entero ocupa 4 bytes por lo que al cargar el archivo con un editor de texto te van a parecer 4 caracteres y lo mas posible es que no tengan sentido.

Si quieres que la informacion sea leible desde algun editor, primero deberias transformar los numeros a cadenas... o usar algunas de las funciones que ya vienen con C.
Si eso no te interesa simplemente con fread podes recuperar los valores.....
  #3 (permalink)  
Antiguo 27/08/2010, 16:03
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Respuesta: Error con la función fwrite.

Cita:
Iniciado por sam90 Ver Mensaje
Te esta pasando lo siguiente. Con fwrite copias uno a uno la informacion, osea se copia bits a bits.

Cualquier lector de archivos, lee bytes a bytes (8bits) y muestra un caracter por cada bytes. Es por eso que el nombre se ve bien porque los caracteres ocupan un bytes. En cambia un entero ocupa 4 bytes por lo que al cargar el archivo con un editor de texto te van a parecer 4 caracteres y lo mas posible es que no tengan sentido.

Si quieres que la informacion sea leible desde algun editor, primero deberias transformar los numeros a cadenas... o usar algunas de las funciones que ya vienen con C.
Si eso no te interesa simplemente con fread podes recuperar los valores.....
Pero fread, ¿No es para leer un archivo?, o me dices que la única forma de verlo sea cuando utilice leer inventario.

Estoy viendo la función itoa, para convertirlo.
  #4 (permalink)  
Antiguo 27/08/2010, 16:56
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Error con la función fwrite.

fread es para leer archivos, como vos lo que haces es escribir el archivo de una, para leer el inventario debes leer el archivo.

No te compliques con itoa, puedes usar fprintf(db,"%d",variable); con eso ya se imrpime como digitos en el archivo.

Como dije antes, no hace faltas uqe lo conviertas, si solo quieres poder leerlo desde tu programa.
  #5 (permalink)  
Antiguo 27/08/2010, 17:15
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Respuesta: Error con la función fwrite.

Cita:
Iniciado por sam90 Ver Mensaje
fread es para leer archivos, como vos lo que haces es escribir el archivo de una, para leer el inventario debes leer el archivo.

No te compliques con itoa, puedes usar fprintf(db,"%d",variable); con eso ya se imrpime como digitos en el archivo.

Como dije antes, no hace faltas uqe lo conviertas, si solo quieres poder leerlo desde tu programa.
Ah buenísimo a eso me refería, yo lo hice de la siguiente manera:

Código C:
Ver original
  1. void menu(){
  2.     printf("\n\nMenu:\n=====\n\n");
  3.     printf("1.- Agregar a inventario\n");
  4.     printf("2.- Leer inventario\n");
  5.     printf("3.- Salir \n\n");
  6.     printf("Escoge una opcion: ");fflush(stdout);
  7. datos.opcion = getch();
  8. FILE *meter, *leer;
  9.  
  10. switch (datos.opcion){
  11.     case '1':
  12.     meter = fopen("DB/inventario.db", "r");
  13.     printf("\nCuantos productos deseas agregar: ");
  14.     scanf("%i", &datos.productos);
  15. for (datos.i = 0 ; datos.i < datos.productos ; datos.i++){
  16.     printf("Introduce el nombre del producto: "); fflush(stdout);
  17.     scanf("%s", &inventario.producto);
  18.     printf("Introduce el codigo del producto: "); fflush(stdout);
  19.     scanf("%i", &inventario.codigo);
  20.     printf("Introduce el precio del producto: "); fflush(stdout);
  21.     scanf("%f", &inventario.precio);
  22.     fwrite(&inventario, sizeof(inventario), 1, meter);
  23.     fclose (meter);
  24.     break;
  25.     case '2':
  26.     leer = fopen("DB/inventario.db", "w");
  27.     fprintf(leer, "%s", inventario.producto);
  28.     fclose (leer);
  29.     break;

Pero al final no me muestra lo del archivo.
  #6 (permalink)  
Antiguo 27/08/2010, 17:22
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Error con la función fwrite.

que te muestra eso?? solo la primer palabra, no?
  #7 (permalink)  
Antiguo 27/08/2010, 17:33
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Respuesta: Error con la función fwrite.

Cita:
Iniciado por sam90 Ver Mensaje
que te muestra eso?? solo la primer palabra, no?
No, hay no tena la función fread. Ahora lo tengo así, y mete los datos, pero cuando apretó la segunda opción me borra todo lo que esta dentro del archivo y no muestra nada.
Código C:
Ver original
  1. void menu(){
  2.     printf("\n\nMenu:\n=====\n\n");
  3.     printf("1.- Agregar a inventario\n");
  4.     printf("2.- Leer inventario\n");
  5.     printf("3.- Salir \n\n");
  6.     printf("Escoge una opcion: ");fflush(stdout);
  7. datos.opcion = getch();
  8. FILE *meter, *leer;
  9.  
  10. switch (datos.opcion){
  11.     case '1':
  12.     meter = fopen("DB/inventario.db", "a");
  13.     printf("\nCuantos productos deseas agregar: ");
  14.     scanf("%i", &datos.productos);
  15. for (datos.i = 0 ; datos.i < datos.productos ; datos.i++){
  16.     printf("Introduce el nombre del producto: "); fflush(stdout);
  17.     scanf("%s", &inventario.producto);
  18.     printf("Introduce el codigo del producto: "); fflush(stdout);
  19.     scanf("%i", &inventario.codigo);
  20.     printf("Introduce el precio del producto: "); fflush(stdout);
  21.     scanf("%f", &inventario.precio);
  22.     fwrite(&inventario, sizeof(inventario), 1, meter);
  23.     fclose (meter);}
  24.     break;
  25.     case '2':
  26.     leer = fopen("DB/inventario.db", "w");
  27.     fread (&inventario, sizeof(inventario), 1, leer);
  28.     fprintf(leer, "%s", inventario.producto);
  29.     fclose (leer);
  30.     break;
  31. }
  32. }
  #8 (permalink)  
Antiguo 27/08/2010, 17:41
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Error con la función fwrite.

pasaa que abris el archivo en modo escritura ("W") deberias poner "r" para abrirlo como lectura.
  #9 (permalink)  
Antiguo 27/08/2010, 17:53
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Respuesta: Error con la función fwrite.

Listo investigando mire que fprintf era para imprimir un texto deseado en el archivo. Así que probé con printf y funciono. Aqui dejo el codigo completo, por si luego alguien necesita la solucion.
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio2.h>
  5.  
  6. struct {
  7.     char  producto[20];
  8.     int   codigo;
  9.     float precio;
  10. } inventario, *p_inv;
  11.  
  12. struct {
  13.     char  producto[20];
  14.     int   codigo;
  15.     float precio;
  16. } inventario2;
  17.  
  18. struct {
  19.     int opcion;
  20.     int productos;
  21.     int i;
  22. } datos;
  23.  
  24. void menu(){
  25.     printf("\n\nMenu:\n=====\n\n");
  26.     printf("1.- Agregar a inventario\n");
  27.     printf("2.- Leer inventario\n");
  28.     printf("3.- Salir \n\n");
  29.     printf("Escoge una opcion: ");fflush(stdout);
  30. datos.opcion = getch();
  31. FILE *meter, *leer;
  32.  
  33. switch (datos.opcion){
  34.     case '1':
  35.     meter = fopen("DB/inventario.db", "a");
  36.     printf("\nCuantos productos deseas agregar: ");
  37.     scanf("%i", &datos.productos);
  38. for (datos.i = 0 ; datos.i < datos.productos ; datos.i++){
  39.     printf("Introduce el nombre del producto: "); fflush(stdout);
  40.     scanf("%s", &inventario.producto);
  41.     printf("Introduce el codigo del producto: "); fflush(stdout);
  42.     scanf("%i", &inventario.codigo);
  43.     printf("Introduce el precio del producto: "); fflush(stdout);
  44.     scanf("%f", &inventario.precio);
  45.     fwrite(&inventario, sizeof(inventario), 1, meter);}
  46.     fclose (meter);
  47.     break;
  48.     case '2':
  49.     leer = fopen("DB/inventario.db", "r");
  50.     while (!feof(leer)) {
  51.     if (fread (&inventario, sizeof(inventario), 1, leer)){
  52.     printf("%s %i %f", inventario.producto, inventario.codigo, inventario.precio);}}
  53.     fclose (leer);
  54.     break;
  55. }
  56. }
  57.  
  58. int main(){
  59. menu();
  60. return 0;
  61. }

Última edición por guzzano; 27/08/2010 a las 18:02
  #10 (permalink)  
Antiguo 27/08/2010, 18:10
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Error con la función fwrite.

Si esta bien...la idea del fprintf era para que escribieras en el archivo con texto pre formateado!! Pero asi como lo dejaste esta bien!
  #11 (permalink)  
Antiguo 27/08/2010, 18:12
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Respuesta: Error con la función fwrite.

Cita:
Iniciado por sam90 Ver Mensaje
Si esta bien...la idea del fprintf era para que escribieras en el archivo con texto pre formateado!! Pero asi como lo dejaste esta bien!
Si ya me di cuenta, hice un formato con fprintf, y en el editor de texto salen sin caracteres raros. Muchísimas gracias

Etiquetas: fwrite
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:25.