elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ayuda , guardar en un regsitro, inconvenientes
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda , guardar en un regsitro, inconvenientes  (Leído 3,103 veces)
yeah_2796

Desconectado Desconectado

Mensajes: 6


Ver Perfil
ayuda , guardar en un regsitro, inconvenientes
« en: 23 Enero 2018, 02:04 am »

Hola a todos, verán tengo un incoveninete, tengo que leer desde un archivo que se llama entrada.in donde me daran varios de diferentes cosas, tiempo de llegada, scanners, impresoras, etc... valores los cuales tengo que guardar en un registro y bueno, use un arreglo de structs para eso, el asunto es que primero leo con fgetc cada numero caracter sin comas ni espacios en blancos,

despues el problema surge que al imprimir esos mismo valores que guardo, ocurre un problema ... creo que me imprime valores negativos entre cada valor y que tambien pareciera que en el ultimo valor, no se tomara un valor, como si no estuviera:

ejemplo del archivo:

1, 0, 1, 0, 0, 0, 0
1, 1, 2, 1, 0, 0, 1
3, 3, 6, 1, 0, 1, 2

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. struct list_entra {                       //registro con 7 campos
  6. int tiempo_llegada;
  7.    int prioridad;
  8.    int procesa;
  9.    int scanner;
  10.    int impresora;
  11.    int modem;
  12.    int dvd;
  13. }proentra [7] ;
  14.  
  15.  
  16. int main (int argc, char *argv[]) {
  17. int contaproceso= 0, i;                   //contador para saber en cual celda del arreglo de struct se guardará
  18. int contcanti =0;                            //contador que uso para ver los diferentes campos del struct
  19. char carac;
  20.  
  21.    FILE *archivo;
  22.    archivo= fopen("listaprocesos.in", "r");
  23.  
  24.    if (archivo == NULL){
  25.        printf ("error al abrir archivo \n");
  26.        exit (1);
  27.    }
  28.  
  29.    while (carac != EOF){                                                            //imprimo para ver si lee bien los caracteres que necesito
  30. carac= fgetc (archivo);
  31.        if (carac != '\n' && carac != ',' && carac != ' '){
  32. printf ("%c\n", carac);
  33.        }
  34.  
  35.        if (contcanti==0){ //lleno el registro y resto -48 para pasar de caracter a entero
  36. proentra [contaproceso].tiempo_llegada= (int)(carac-48);
  37. }else if (contcanti==1){
  38. proentra[contaproceso].prioridad= (int)(carac-48);
  39. }else if (contcanti==2){
  40. proentra[contaproceso].procesa= (int)(carac-48);
  41. }else if (contcanti==3){
  42. proentra[contaproceso].scanner= (int)(carac-48);
  43. }else if (contcanti==4){
  44. proentra[contaproceso].impresora = (int)(carac-48);
  45. }else if (contcanti==5){
  46. proentra[contaproceso].modem= (int)(carac-48);
  47. }else if (contcanti==6){
  48. proentra[contaproceso].dvd= (int)(carac-48);
  49. }
  50. contcanti++;
  51.  
  52. if (contcanti==7){
  53. contcanti=0;
  54. contaproceso++;
  55. }
  56.    }
  57.  
  58.    for (i=0;i<contaproceso;i++){                                      //imprimo por pantalla
  59. printf ("\n%d", proentra[i].tiempo_llegada );
  60. printf ("\n%d", proentra[i].prioridad );
  61. printf ("\n%d", proentra[i].procesa);
  62. printf ("\n%d", proentra[i].scanner);
  63. printf ("\n%d", proentra[i].impresora);
  64. printf ("\n%d", proentra[i].modem);
  65. printf ("\n%d", proentra[i].dvd);
  66. }
  67.  
  68.    fclose (archivo);
  69.  
  70.    return 0;
  71. }
  72.  
  73.  

y me muestra por consola esto:

1
0
1
0
0
0
0
1
1
2
1
0
0
1
3
3
6
1
0
1
2


1
-4
-16
0
-4
-16
1
-4
-16
0
-4
-16
0
-4
-16
0
-4
-16
0
-38
1
-4
-16
1
-4
-16
2
-4
-16
1
-4
-16
0
-4
-16
0
-4
-16
1
-38
3
-4
-16
3
-4
-16
6
-4
-16
1
-4
-16
0
-4
-16
1


podrían ayudarme, es una tarea que me mandaron, soy principiante en programación y he estado observando pero no lo logró ver el problema.


« Última modificación: 23 Enero 2018, 02:07 am por yeah_2796 » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: ayuda , guardar en un regsitro, inconvenientes
« Respuesta #1 en: 23 Enero 2018, 10:34 am »

Todo lo que tienes hecho debe estar dentro del if(carácter !='\n'...
Cómo lo haces fuera, tu contador también cuenta esos caracteres y como lo usas para presentarlos en pantalla te devuelve lo que hay más allá de tus datos.


En línea

yeah_2796

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: ayuda , guardar en un regsitro, inconvenientes
« Respuesta #2 en: 23 Enero 2018, 12:30 pm »

vale gracias MAFUS, en seguida lo pruebo, supongo que cuando dices "todo debe estar del if (caracter!=\n)" hablas de todos los if y else if nada mas cierto?
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: ayuda , guardar en un regsitro, inconvenientes
« Respuesta #3 en: 23 Enero 2018, 14:11 pm »

Así es. El problema es que actualizas contaproceso y cintacanti fuera de eso, por tanto también suman las comas y los otros caracteres no deseados.

Por otra parte, y como consejo, todos esos if-else que se basan en un número entero los puedes sustituir por otra construcción que existe en C para ese propósito: switch-case. El código quedará más claro.
Aunque aún puedes ir un paso más allá con otra instrucción que te hará toda la captura de forma automática aprovechando que el formato del archivo siempre es el mismo y se considera, de por sí, bien formateado: la función fscanf. El grupo de de funciones scanf son muy potentes para estos trabajos pero para eso uno debe saber usar la cadena de control, aunque no es nada difícil.
En línea

dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: ayuda , guardar en un regsitro, inconvenientes
« Respuesta #4 en: 12 Febrero 2018, 09:30 am »

Si sabes con garantías que el fichero de entrada tiene un formato definido...
¿ por qué no utilizar entrada-salida formateada? Es más fácil. te ahorras procesamiento de comas y espacios...

Aquí te dejo una idea. Tu la cojes y la adaptas a tus estructuras de registros, etc..  Yo he puesto fn, como abreviatura de "field"....


Código
  1. /*
  2.   string formatted input-output
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <errno.h>
  7. #include <stdlib.h>
  8.  
  9. #define MAX 1000
  10.  
  11. int main (void)
  12. {
  13.  FILE *f;
  14.  int f0[MAX],f1[MAX],f2[MAX],
  15.      f3[MAX],f4[MAX],f5[MAX],f6[MAX];
  16.  int n,N;
  17.  
  18.  if (!(f = fopen("listaprocesos.in","r")))
  19.    {
  20.      perror("fopen");
  21.      exit(EXIT_FAILURE);
  22.    };
  23.  for (N=0 ; fscanf(f,"%d, %d, %d, %d, %d, %d, %d\n",
  24.    &f0[N],&f1[N],&f2[N],&f3[N],&f4[N],&f5[N],&f6[N])!=EOF; N++ );
  25.  
  26.  for (n=0 ; n<N ; n++)
  27.    printf("%d, %d, %d, %d, %d, %d, %d\n",
  28.   f0[n],f1[n],f2[n],f3[n],f4[n],f5[n],f6[n]);
  29.  fclose(f);
  30.  return 0;
  31. }


Contenido de "listaprocesos.in"

Código:
1, 0, 1, 0, 0, 0, 0
1, 1, 2, 1, 0, 0, 1
3, 3, 6, 1, 0, 1, 2
2, 3, 1, 0, 0, 3, 2

Salida del programa.

Código:
1, 0, 1, 0, 0, 0, 0
1, 1, 2, 1, 0, 0, 1
3, 3, 6, 1, 0, 1, 2
2, 3, 1, 0, 0, 3, 2
En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
C# Coger valor de un Regsitro Hexadecimal
.NET (C#, VB.NET, ASP)
Jacablaca 3 2,601 Último mensaje 9 Noviembre 2012, 22:11 pm
por Jacablaca
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines