Ver Mensaje Individual
  #13 (permalink)  
Antiguo 03/11/2011, 20:38
sam90
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 10 meses
Puntos: 228
Respuesta: Modificar Archivo en C

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. void carga(FILE *parchivo);
  5. void mostrar(FILE *parchivo);
  6.  
  7. //Código ASCII
  8. #define S 83
  9. #define s 115
  10.  
  11. // Las estructuras definilas afuera del main o de cualqueir funcion, asi son visibles por todos ************************
  12. // AGREGO UN TYPEDEF PARA  NO TENER QUE USAR LA PALABRA STRUCT TODO EL TIEMPO. APARTIR DE AHORA ES UN TIPO  MAS COMO TODOS.
  13. typedef struct __listaPrecios{
  14.     int cod;
  15.     char prod[50];
  16.     float precio;
  17. } listaPrecios;
  18.  
  19.  
  20.     int main(){
  21.  
  22.         FILE *parchivo;
  23.         parchivo=fopen("archivo.txt", "ab+"); // ERROR: Estabas abriendo mal el archivo....faltaba el modo binario.
  24.         listaPrecios t;
  25.         int i, buscar=0, op, altas, otroIngreso[2];
  26.         printf("1 - Altas\n");
  27.         printf("2 - Modificaciones\n");
  28.         printf("3 - Bajas\n");
  29.         printf("4 - Mostrar Lista \n");
  30.         printf("5 - Salir\n");
  31.         scanf("%i", &op);
  32.  
  33.         switch(op){
  34.             case 1:  // NO SE NECESITABAN LAS LLAVES NI EL IF  
  35.                 carga(parchivo);
  36.                 break;
  37.  
  38.             case 2:
  39.                 //mostrar(parchivo);
  40.  
  41.                 printf("****************************************** *****\n");
  42.                 printf("Ingrese el codigo del archivo que desea buscar\n");
  43.                 scanf("%i", &buscar);
  44.                 i = fseek(parchivo,(buscar-1) * sizeof(listaPrecios), SEEK_SET);
  45.                 fread(&t,sizeof(listaPrecios),1,parchivo);
  46.                 printf("%d: %d %s %f\n", i, t.cod , t.prod , t.precio);
  47.                 break;
  48.  
  49.             case 3:
  50.                 break;
  51.  
  52.             case 4:
  53.                 //mostrar(parchivo);
  54.                 break;
  55.            
  56.             case 5:
  57.                 //close();
  58.                 break;
  59.  
  60.         }
  61.         fclose(parchivo);
  62.     }
  63. //-----------------------------------------------------------------
  64.  
  65. //Funcion de ALTA
  66.     void carga(FILE *parchivo)
  67.     {
  68.         int i;
  69.         listaPrecios l;
  70.         char sig;
  71.  
  72.         do{
  73.             for(i=0;i<1;i++){
  74.                 printf("Ingrese el codigo:");
  75.                 scanf("%i", &(l.cod));
  76.                 while(getchar() != '\n');
  77.                 printf("Ingrese el producto:");
  78.                 gets(l.prod);
  79.                 printf("Ingrese el precio");
  80.                 scanf("%f", &(l.precio));
  81.                 while(getchar() != '\n');
  82.                 // ERROR FATAL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  83.                 // ESTABAS ESCRIBIENDO TEXTO Y NO EN BINARIO ASI QUE NUNCA IBAS A PODER LEER
  84.                 fseek ( parchivo , 0 , SEEK_END ); //  ME POSICIONO AL FINAL DEL ARCHIVO
  85.                 fwrite(&l, sizeof(listaPrecios) , 1 , parchivo);
  86.             }
  87.             printf(" ¿Desea Agregar otro producto? Ingrese la letra: S, de lo contrario ingrese: N\n");
  88.             scanf("%s", &sig);
  89.         }while(sig == 'S' || sig == 's');
  90.  
  91.     }
  92.  
  93. /*
  94. //Funcion de Mostrar contenido del fichero
  95.     void mostrar(FILE *parchivo)
  96.     {
  97.  
  98.         struct listaPrecios vec[1];
  99.  
  100.     printf("El contenido del archivo es: \n");
  101.  
  102. //Recorro el archivo
  103.     do{
  104.     fgets(vec, 100, parchivo);
  105.     puts(vec);
  106.     }while(fgetc(parchivo) != EOF);
  107.  
  108. }
  109. */
  110. //------------------------------------------------------


Perdon por lo que voy a decir, pero estaba todo pesimamente hecho. Por un lado imprimes como si fuese texto plano y por otro lado querias leer como si fuesse binario... ahi lo corregi para que quede tipo binario y a mi me funciono. Solo una aclaracion, el modificar quedo hecho un buscar por asi decirlo. Te pide el numero de registro y lo muestra nada mas...pero anda.

Te falta mucho por aprender....yo leeria un poco mas y haria cosas mas faciles para empezar...como manejar el tema de punteros y memoria. Eso te va a aclarar mucho como se manejan los achivos en C++..

Saludos,

PD: Agregue indexado al codigo y un para de comentarios como para que aprendas un par de cosas. Como por ejemplo donde declarar las estructuras y el uso del typedef.