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

Función que debería escribir en un archivo .txt no lo hace debidamente

Estas en el tema de Función que debería escribir en un archivo .txt no lo hace debidamente en el foro de C/C++ en Foros del Web. Saludos a todos. Llevo ya varias semanas intentando encontrar el error pero no doy con el, ya he intentado con muchas cosas pero nada. Tengo ...
  #1 (permalink)  
Antiguo 27/04/2012, 15:27
Dtc
 
Fecha de Ingreso: marzo-2011
Ubicación: México
Mensajes: 39
Antigüedad: 13 años, 1 mes
Puntos: 1
Mensaje Función que debería escribir en un archivo .txt no lo hace debidamente

Saludos a todos. Llevo ya varias semanas intentando encontrar el error pero no doy con el, ya he intentado con muchas cosas pero nada.
Tengo una función que agrega (o al menos, debería agregar) productos a una "base de datos" en .txt, y cual es parte de un programa tipo caja registradora que estoy desarrollando; el programa recibe el nombre del producto y el precio en float, luego busca con otra función el caracter de salto de linea del nombre de producto introducido y lo elimina para que se vea correcto, después debería colocar el nombre del producto en una base de datos llamada "bdproductos.txt" y el precio en otra llamada "bdprecios.txt", en el renglon siguiente al que ya está ocupado por algún otro nombre, número o texto, después cuenta el número de lineas para saber la ubicación del último registro y lo presenta en pantalla junto con los datos introducidos. El problema es que no funciona así.
Aquí el código en cuestión de la función para agregar productos:

Código C:
Ver original
  1. void agregar_producto(char nuevo_producto_nombre[200], float nuevo_producto_precio) //Función para agregar un nuevo registro (producto)
  2. {
  3.    int nregistros1, nregistros2, nletras1, nletras2;
  4.    char tempo[200], buffa[50];
  5.  fflush(stdin);
  6. fclose(fp2);
  7. fclose(fp3);
  8. fp2 = fopen("bdproductos.txt", "r+");
  9. fp3 = fopen("bdprecios.txt", "r+");
  10.  
  11.   nregistros1 = contarlineas(2);
  12.   nregistros2 = contarlineas(3);  
  13.   nletras1 = contarletras(2,(nregistros1-1));
  14.   nletras2 = contarletras(3,(nregistros2-1));  
  15.  
  16.  
  17.  
  18. //Coloca el cursor en la última linea, al inicio primero y después mueve el cursor al final de la linea para colocar un final de linea y escribir el registro
  19. linea((nregistros1-1),2);
  20. linea((nregistros2-1),3);
  21. fflush(stdin);
  22. fseek(fp2, nletras1, SEEK_CUR);
  23. fseek(fp3, nletras2, SEEK_CUR);
  24. fflush(stdin);
  25. Sleep(10);  
  26. fputc('\n', fp2);
  27. Sleep(10);
  28. fflush(stdin);
  29. fputc('\n', fp3);
  30. Sleep(30);
  31. fflush(stdin);
  32. //Escribe el registro
  33. Sleep(30);
  34. fflush(stdin);
  35. sprintf(buffa, "%f", nuevo_producto_precio);
  36. fputs(buffa, fp3);
  37. fprintf(fp3, "%f", nuevo_producto_precio);
  38. Sleep(20);
  39. fflush(stdin);
  40. fputs(nuevo_producto_nombre, fp2);
  41. fflush(stdin);
  42. fputc('\n', fp2);
  43. fputc('\n', fp3);
  44. }

Aca la función contar lineas:

Código C:
Ver original
  1. int contarlineas(int tipo) //Función para contar las lineas, compatible con las 3 bases de datos
  2. {
  3. int i=0;
  4. char tempo[80];
  5. //Se revisa si el archivo está vacío
  6. if (tipo == 1)
  7. {
  8. if (fscanf(fp, tempo) == EOF)//Si el archivo no contiene lineas, el control de programa va a la etiqueta "vacío"
  9. goto vacio;
  10. }
  11. if (tipo == 2)
  12. {
  13. if (fscanf(fp2, tempo) == EOF)
  14. goto vacio;
  15. }
  16. if (tipo == 3)
  17. {
  18. if (fscanf(fp3, tempo) == EOF)
  19. goto vacio;
  20. }        
  21. //Si es del documento 1
  22. if (tipo == 1)
  23. {
  24. rewind (fp);
  25. do
  26. {
  27. fgets(tempo, 50, fp);      
  28. i++;
  29. }while(!feof(fp));
  30. }
  31. //Si es del documento 2
  32. if (tipo == 2)
  33. {
  34. rewind (fp2);        
  35. do
  36. {
  37. fgets(tempo, 50, fp2);      
  38. i++;
  39. }while(!feof(fp2));
  40. }  
  41. //Si es del documento 3      
  42. if (tipo == 3)
  43. {
  44. rewind (fp3);        
  45. do
  46. {
  47. fgets(tempo, 50, fp3);      
  48. i++;
  49. }while(!feof(fp3));
  50. }
  51. vacio:
  52. return i;
  53. }

Acá la función para contar letras
Código C:
Ver original
  1. int contarletras(int tipo, int lineaobjetivo)
  2. {
  3. char tempo[500];
  4. int i=0;
  5. if (tipo == 1)
  6. {
  7. linea(lineaobjetivo,1);
  8. if (fscanf(fp,tempo) == EOF)
  9. goto nada;  
  10. fgets(tempo, 500, fp);
  11. i = strlen(tempo);
  12. }
  13. if (tipo == 2)
  14. {
  15. linea(lineaobjetivo,2);
  16. if (fscanf(fp2,tempo) == EOF)
  17. goto nada;  
  18. fgets(tempo, 500, fp2);
  19. i = strlen(tempo);
  20. }
  21. if (tipo == 3)
  22. {
  23. linea(lineaobjetivo,3);
  24. if (fscanf(fp3,tempo) == EOF)
  25. goto nada;  
  26. fgets(tempo, 500, fp3);
  27. i = strlen(tempo);
  28. }
  29. nada:
  30. return i;
  31. }

Acá la función para ubicar el cursor en una linea específica

Código C:
Ver original
  1. void linea(int num, int ndocumento)  //Función para colocar el cursor en un renglon específico (indicado por int num), del documento indicado (indicado por int ndocumento)
  2. {
  3.   //Si el documento es del tipo 1
  4. if (ndocumento == 1)
  5. {    
  6. int conta=num-1;
  7. fseek(fp, 0, SEEK_SET);
  8. inicho:    
  9. if (conta>0)  
  10. {
  11. while (fgetc (fp) != '\n');
  12. conta--;
  13. goto inicho;
  14. }
  15. }
  16.   //Si el documento es del tipo 2
  17. if (ndocumento == 2)
  18. {
  19. int conta=num-1;
  20. fseek(fp2, 0, SEEK_SET);
  21. inicho2:    
  22. if (conta>0)  
  23. {
  24. while (fgetc (fp2) != '\n');
  25. conta--;
  26. goto inicho2;
  27. }
  28. }
  29.   //Si el documento es del tipo 3
  30. if (ndocumento == 3)
  31. {
  32. int conta=num-1;
  33. fseek(fp3, 0, SEEK_SET);
  34. inicho3:    
  35. if (conta>0)  
  36. {
  37. while (fgetc (fp3) != '\n');
  38. conta--;
  39. goto inicho3;
  40. }
  41. }
  42.   //Si el documento es del tipo 4 (El documento temporal, para la función reemplazar)
  43. if (ndocumento == 4)
  44. {
  45. int conta=num-1;
  46. fseek(temp, 0, SEEK_SET);
  47. inicho4:    
  48. if (conta>0)  
  49. {
  50. while (fgetc (temp) != '\n');
  51. conta--;
  52. goto inicho4;
  53. }
  54. }
  55. }

Acá la función para "limpiar" una cadena de los saltos de linea

Código C:
Ver original
  1. char *limpiar (char cadena[200]) //Función para limpiar palabras o cadenas de saltos de linea (\n)
  2. {
  3.          
  4.  char tempo[200];
  5.      
  6.    int letras = strlen(cadena), i;
  7.      
  8.      for(i=0;i<letras; i++)
  9.       {
  10.         if (cadena[i] != '\n')                    
  11.         tempo[i] = cadena[i];
  12.       }
  13.     tempo[i+1] = '\0';  
  14.    cadena = tempo;
  15.      
  16.  return cadena;
  17. }

Y por último, las variables globales, por si es que:

Código C:
Ver original
  1. int producto_clave, respuesta, registros, tempomultin;
  2. float nuevo_producto_precio;
  3. char nombre_negocio[300], tiempos[128], direccion[300], propietario[300], nuevo_producto_nombre[200], nuevo_producto_nombre1[200], tempomulti[200];


¿Podría alguien checar el código y ver en que la he cajeteado?
Gracias de antemano
__________________
La Web del Dtc
http://www.dtcsrni.tk
DtcSrni Technologies
http://technologies.dtcsrni.tk
  #2 (permalink)  
Antiguo 28/04/2012, 14:21
 
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
  #3 (permalink)  
Antiguo 28/04/2012, 14:54
Dtc
 
Fecha de Ingreso: marzo-2011
Ubicación: México
Mensajes: 39
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Función que debería escribir en un archivo .txt no lo hace debidamente

Muchas gracias por responder. Lo que pasa es que he intentado muchas cosas ya y entre eso pues intenté hacer algunas cosas varias veces. La razón de cerrar los archivos es que esos se abren al inicio del programa, y yo pensando que podrían crear algun problema los cerré y los volví a abrir en esa función. Sobre el goto, pienso cambiarlo por algunas condicionales y mejorar el código, pero están mientras ahí en lo que el programa logra funcionar, en esa única parte me he quedado varado. El código completo es este (a lo mejor ya se entiende un poco más el porqué de algunas cosas):

http://pastebin.com/Zhz76KRc

Saludos y gracias
__________________
La Web del Dtc
http://www.dtcsrni.tk
DtcSrni Technologies
http://technologies.dtcsrni.tk

Etiquetas: funcion, int, programa, txt, variables
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 01:32.