Ver Mensaje Individual
  #2 (permalink)  
Antiguo 28/04/2012, 14:21
cesar_casla
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 4 meses
Puntos: 94
Respuesta: Función que debería escribir en un archivo .txt no lo hace debidamente

Hola! El uso de goto si bien no esta prohibido no es recomendable utilizarlo ya que no respeta la forma estructurada de un programa, es de mala practica usarlo
La verdad sin ofenderte no entendi casi nada tu programa va de echo no me dio muchas ganas de analizarlo, pero vi algunas cosas como: ¿xq haces fclose(fp2); y fclose(fp3); antes de abrir los archivos?
En este pedazo de codigo:
Código C:
Ver original
  1. sprintf(buffa, "%f", nuevo_producto_precio);
  2. fputs(buffa, fp3);
  3. fprintf(fp3, "%f", nuevo_producto_precio);
Primero con sprintf guardas nuevo_producto_precio con formato en buffa, luego con fputs lo mandas al achivo fp3 pero despues volves a hacer lo mismo con fprintf¿para que lo guadas dos veces?
Otra cosa que haces es "limpiar" el salto de linea de una cadena pero luego vos haces un fputc('\n', fp2); o fputc('\n', fp3); para guardarle el salto de linea en el archivo¿no es mejor dejarle el salto de linea a la cadena??? Te ahorrarias una funcion

Como no se todos los errores q tenes, te dejo un programa simple que hace mas o menos todo lo que detallas en el enunciado. No utiliza variables globales ya que no me gusta
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. void agregar_producto(FILE *fp1,FILE *fp2,char nuevo_producto_nombre[], float nuevo_producto_precio); //Función para agregar un nuevo registro (producto)
  5. int ultimoRegistro(FILE *fp1,FILE *fp2,char nuevo_producto_nombre[], float *nuevo_producto_precio);
  6.  
  7. int main(void)
  8. {
  9.     FILE *fp1,*fp2;
  10.     char nuevo_producto_nombre[30];
  11.     float nuevo_producto_precio;
  12.     int lineas;
  13.     char ch;
  14.    
  15. /* abro los archivos para añadir; los cursores se posicionan al final del archivo
  16. De esta forma evito utilizar fseek para mover el cursor al final */
  17.     fp1 = fopen("bdproductos.txt","a+");
  18.     fp2 = fopen("bdprecios.txt", "a+");
  19.    
  20.     do {
  21.        printf("Ingrese el nombre del producto\n");
  22.        scanf("%s",nuevo_producto_nombre);
  23.        printf("Ingrese el precio del producto\n");
  24.        scanf("%f",&nuevo_producto_precio);
  25.        
  26.        agregar_producto(fp1,fp2,nuevo_producto_nombre,nuevo_producto_precio);
  27.        
  28.        while(getchar()!='\n');
  29.        printf("Desea seguir ingresando registros(S/N)\n");
  30.        scanf("%c",&ch);
  31.     }while(ch=='S' || ch=='s');
  32.    
  33.     /* si se crean dos archivos con nombre y precio del producto se supone que se ingresan
  34.     las mismas cantidades de lineas */
  35.     lineas=ultimoRegistro(fp1,fp2,nuevo_producto_nombre,&nuevo_producto_precio); /* paso la direccion de nuevo_producto_precio para modificarlo en la funcion */
  36.     printf("Cantidad de registros: %d\n",lineas);
  37.     printf("Ultimo registro: nombre %s\tprecio %f\n\n",nuevo_producto_nombre,nuevo_producto_precio);
  38.    
  39.     /* cierre de los archivos */
  40.     fclose(fp1);
  41.     fclose(fp2);
  42.     /* si estas compilando en linux comenta el system */
  43.     system("PAUSE");
  44.     return 0;
  45. }
  46.  
  47.  
  48. void agregar_producto(FILE *fp1, FILE *fp2,char nuevo_producto_nombre[], float nuevo_producto_precio)
  49. {
  50.      fprintf(fp1,"%s\n",nuevo_producto_nombre);
  51.      fprintf(fp2,"%f\n",nuevo_producto_precio);
  52.      
  53.      return;
  54. }
  55.  
  56. /* esta funcion es para saber cual es el ultimo registro */
  57. int ultimoRegistro(FILE *fp1,FILE *fp2,char nuevo_producto_nombre[], float *nuevo_producto_precio)
  58. {
  59.     int i=0;
  60.     int j=0;
  61.    
  62.    
  63.     rewind(fp1);
  64.     fscanf(fp1,"%s",nuevo_producto_nombre);
  65.     while(!feof(fp1))
  66.     {
  67.        fscanf(fp1,"%s",nuevo_producto_nombre);
  68.        i++;
  69.     }
  70.    
  71.     rewind(fp2);
  72.     fscanf(fp2,"%f",&(*nuevo_producto_precio));
  73.     while(!feof(fp2))
  74.     {
  75.        fscanf(fp2,"%f",&(*nuevo_producto_precio));
  76.        j++;
  77.     }
  78.     if(i==j) return i; /* hay las mismas lineas en los archivos */
  79.    
  80.     return -1; /* hubo algun error en los datos de los archivos */
  81. }

Saludos

PD: un consejo volve a hacer tu programa paso x paso y en lo posible evita el goto