• Sábado 12 de Julio de 2025, 07:07

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - Amphoth3ra

Páginas: [1]
1
C/C++ / [C] fgets y línea innecesaria [Solucionado]
« en: Jueves 9 de Junio de 2011, 01:13 »
Estoy practicando un poco de fgets con cadenas y me he encontrado con algo bastante extraño, que consiste en que las cadenas que yo entrego de entrada, me salen correctas, pero me salen con una línea de más.

Les explico con código en mano. Esta aplicación pretende guardar en una estructura temporal cuatro datos
1) El nombre de un DVD
2) El género de un DVD
3) El número de discos de un DVD
4) La duración total del DVD en minutos

Código: C
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. struct dvd {
  6.  char name[255];
  7.  char genero[50];
  8.  int discs_number;
  9.  int length;
  10. };
  11.  
  12. int main()
  13. {
  14.     struct dvd temporal;
  15.  
  16.     char discs_number[2];
  17.     char length[4];
  18.  
  19.     printf("Nombre del DVDn");
  20.              fgets(temporal.name, 255, stdin);
  21.  
  22.     printf("%sn", temporal.name); 
  23.  
  24.     printf("Género del DVDn");
  25.             fgets(temporal.genero, 50, stdin);
  26.  
  27.     printf("%sn", temporal.genero);
  28.  
  29.     printf("Número de discos del DVDn");
  30.              fgets(discs_number, 2, stdin);
  31.  
  32.     temporal.discs_number = atoi(discs_number);
  33.  
  34.     printf("%dn", temporal.discs_number);
  35.  
  36.     printf("Duración del DVDn");
  37.        
  38.     while(getchar() != 'n');
  39.             fgets(length, 4, stdin);
  40.  
  41.     temporal.length = atoi(length);
  42.    
  43.     printf("%dn", temporal.length);
  44.  
  45.    
  46.  
  47.     return(0);
  48. }
  49.  

Cuando ejecuto el programa, si introducen el nombre del DVD, la cadena que se me regresa es correcta cuando yo haga el printf, pero automáticamente se me salta una línea. Lo mismo pasa con el género del DVD.

Los campos de número de discos y de duración del DVD funcionan correctamente.

Pruébenlo con estos datos:
Nombre: Batman
Género: Acción
Número de discos: 1
Duración; 126

¿Que puede estar pasando? (por cierto, mi código está compilado con GCC)

Saludos!

2
C/C++ / [C] Estructuras y archivos binarios
« en: Domingo 8 de Mayo de 2011, 21:11 »
Los problemas que yo tengo se relaciona con estructuras y con el guardado de estas estructuras y archivos binarios. Les explico el concepto: Lo que estoy buscando es almacenar una serie de parámetros a una estructura (rut, edad y nombre) y luego esta estructura se pasa a un archivo binario, el cual luego yo debo leerlo por atributo (sea rut, nombre o edad).

A mí me ocurren dos problemas con el programa que estoy haciendo. En primera instancia, el rut que yo introduzco inicialmente se introduce bien, pero cuando yo lo rescato del archivo binario la parte del rut me aparece con un caracter más del que yo puse originalmente, vale decir que si yo introduzco esta información:

Rut              Edad   Nombre
--------------------------------------------------------------------
12.346.812-7     52     Stephen Berger


Del archivo se me regresa lo siguiente:

Rut              Edad   Nombre
--------------------------------------------------------------------
12.346.812-74     52     Stephen Berger
 

Lo otro extraño que me pasa es que la última estructura que pongo se me duplica al rescatar la información del archivo binario, vale decir, si yo pongo esta información:
Rut              Edad   Nombre
--------------------------------------------------------------------
12.222.618-7     54     Jorge Contreras
12.228.164-4     59     Gerónimo Vallejos
13.433.618-K     47     Claudia Cotapos


Del archivo se me regresa esto:
Rut              Edad   Nombre
--------------------------------------------------------------------
12.222.618-76     54     Jorge Contreras
12.228.164-4;     59     Gerónimo Vallejos
13.433.618-K/     47     Claudia Cotapos
13.433.618-K/     47     Claudia Cotapos

 
Nótese que en lo anterior también se me repite el problema del rut, ustedes pueden ver que me sale un caracter adicional al rut.

Este es el código del programa:
Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct persona {
  6.  char rut[12];
  7.  int edad;
  8.  char nombre[255];
  9.  };
  10.  
  11. // Declaración de tabla y creación del archivo con el que se vá a trabajar
  12. void create_table_personas()
  13. {
  14.     FILE *principal_file, *test_file;
  15.  
  16.     principal_file = fopen ("archivo.dat", "wb");
  17.     if (principal_file==NULL)
  18.         printf ("No se pudo crear el archivon");
  19.  
  20.     fclose(principal_file);
  21.  
  22.     test_file = fopen ("archivo.dat", "rb");
  23.     if (test_file==NULL)
  24.         printf ("No se pudo abrir el archivon");
  25.     rewind(test_file);
  26. }
  27.  
  28. // Inserción en la tabla
  29. void insert_into_table()
  30. {
  31.     int menu2_on = 1;
  32.  
  33.     struct persona avance;
  34.  
  35.     FILE *save_file;
  36.  
  37.     save_file = fopen ("archivo.dat", "r+wb");
  38.  
  39.     fread (&avance, sizeof(struct persona), 1, save_file);
  40.  
  41.     if (avance.edad == 0)
  42.         rewind(save_file);
  43.  
  44.     do {
  45.         do {
  46.             fread (&avance, sizeof(struct persona), 1, save_file);
  47.         } while (!feof(save_file)); 
  48.  
  49.         struct persona data_save;
  50.  
  51.         printf("Rut de la personan");
  52.         scanf("%*c%[^n]",data_save.rut);
  53.         printf("Edad de la personan");
  54.         scanf("%d", &data_save.edad);
  55.         printf("Nombre de la personan");
  56.         scanf("%*c%[^n]",data_save.nombre);
  57.        
  58.         fwrite (&data_save , 1 , sizeof(struct persona) , save_file);
  59.  
  60.         printf("¿Desea agregar otra tupla? (1 Si, 0 No)n");
  61.         scanf("%d", &menu2_on);
  62.  
  63.     } while (menu2_on == 1);
  64.  
  65.     fclose(save_file);
  66.  
  67.     struct persona junior;
  68.     FILE  *test_file;
  69.    
  70.     test_file = fopen ("archivo.dat", "rb");
  71.     if (test_file==NULL)
  72.         printf ("No se pudo abrir el archivon");
  73.  
  74.     printf("Rut              Edad   Nombren");
  75.     printf("--------------------------------------------------------------------n");   
  76.     while (!feof(test_file))
  77.     {   
  78.         fread (&junior, sizeof(struct persona), 1, test_file);
  79.  
  80.         printf("%s     %d     %sn", junior.rut, junior.edad, junior.nombre);  
  81.  
  82.     }
  83. }
  84.  
  85. // Función: Consulta por edad //
  86. void attribute_age()
  87. {
  88.     FILE *checker;
  89.  
  90.     struct persona temporal;
  91.  
  92.     int edad_consulta;
  93.  
  94.     printf("Inserte la edad a consultarn");
  95.     scanf("%d",&edad_consulta);
  96.  
  97.     checker = fopen ("archivo.dat", "rb");
  98.     if (checker==NULL)
  99.         printf ("No se pudo abrir el archivon");
  100.     rewind(checker);
  101.    
  102.     printf("Rut              Edad   Nombren");
  103.     printf("--------------------------------------------------------------------n");
  104.     do {
  105.        
  106.         fread (&temporal, sizeof(struct persona), 1, checker);
  107.  
  108.          if (edad_consulta == temporal.edad)
  109.         {
  110.            
  111.             printf("%s     %d     %sn", temporal.rut,  temporal.edad, temporal.nombre);
  112.          }
  113.  
  114.     } while (!feof(checker));   
  115.  
  116. }
  117.  
  118. // Función: Consulta por nombre
  119. void attribute_name()
  120. {
  121.     FILE *checker2;
  122.  
  123.     struct persona temporal2;
  124.  
  125.     char nombre_consulta[255];
  126.  
  127.     printf("Inserte el nombre a consultarn");
  128.     scanf("%*c%[^n]",nombre_consulta);
  129.  
  130.     checker2 = fopen ("archivo.dat", "rb");
  131.     if (checker2==NULL)
  132.         printf ("No se pudo abrir el archivon");
  133.     rewind(checker2);
  134.    
  135.     printf("Rut              Edad   Nombren");
  136.     printf("--------------------------------------------------------------------n");
  137.     do {
  138.        
  139.         fread (&temporal2, sizeof(struct persona), 1, checker2);
  140.  
  141.          if (nombre_consulta == temporal2.nombre)
  142.         {
  143.            
  144.             printf("%s     %d     %sn", temporal2.rut, temporal2.edad, temporal2.nombre);
  145.          }
  146.  
  147.     } while (!feof(checker2)); 
  148.  
  149. }
  150.  
  151. // Función: Consulta por rut
  152. void attribute_rut()
  153. {
  154.     FILE *checker3;
  155.  
  156.     struct persona temporal3;
  157.  
  158.      char rut_consulta[12];
  159.  
  160.     printf("Inserte el rut a consultarn");
  161.     scanf("%*c%[^n]",rut_consulta);
  162.  
  163.     checker3 = fopen ("archivo.dat", "rb");
  164.     if (checker3==NULL)
  165.         printf ("No se pudo abrir el archivon");
  166.     rewind(checker3);
  167.    
  168.     printf("Rut              Edad   Nombren");
  169.     printf("--------------------------------------------------------------------n");
  170.     do {
  171.        
  172.         fread (&temporal3, sizeof(struct persona), 1, checker3);
  173.  
  174.          if (rut_consulta == temporal3.rut)
  175.         {
  176.            
  177.             printf("%s     %d     %sn", temporal3.rut, temporal3.edad, temporal3.nombre);
  178.          }
  179.  
  180.     } while (!feof(checker3)); 
  181.  
  182. }
  183.  
  184. // Función: Consulta completa
  185. void generate_full()
  186. {
  187.     FILE *checker4;
  188.  
  189.     struct persona temporal4;
  190.    
  191.     checker4 = fopen ("archivo.dat", "rb");
  192.     if (checker4==NULL)
  193.         printf ("No se pudo abrir el archivon");
  194.     rewind(checker4);
  195.    
  196.     printf("Rut              Edad   Nombren");
  197.     printf("--------------------------------------------------------------------n");
  198.     do {
  199.        
  200.         fread (&temporal4, sizeof(struct persona), 1, checker4);
  201.         printf("%s     %d     %sn", temporal4.rut, temporal4.edad, temporal4.nombre);
  202.  
  203.     } while (!feof(checker4)); 
  204. }
  205.  
  206.  
  207. // Menú secundario de búsqueda por atributo,
  208. void attribute_search()
  209. {
  210.     int menu3_option;
  211.  
  212.     do {
  213.  
  214.     printf("1 Consulta por rutn");
  215.     printf("2 Consulta por nombren");
  216.     printf("3 Consulta por edadn");
  217.     printf("4 Generar listado completon");
  218.         scanf("%d", &menu3_option);
  219.  
  220.     switch (menu3_option)
  221.         {
  222.             case 1: printf("n");   
  223.                 attribute_rut();
  224.                 break;
  225.             case 2: printf("n");   
  226.                 attribute_name();
  227.                 break;
  228.             case 3: printf("n");   
  229.                 attribute_age();
  230.                 break;
  231.             case 4: printf("n");   
  232.                 generate_full();
  233.                 break;
  234.             default:
  235.                     printf("Opcion invalidan");
  236.                 break;
  237.         }
  238.  
  239.     } while ((menu3_option < 1) || (menu3_option > 4));
  240. }
  241.  
  242. // Opciones de menú
  243. int menu_option, menu_on = 1;
  244.  
  245. // Menú principal
  246. int main ()
  247. {   
  248.     do {
  249.  
  250.            
  251.         do {   
  252.             printf("n");   
  253.             printf("1 Crear tablan");
  254.             printf("2 Insertar tuplasn");
  255.             printf("3 Ver contenidon");
  256.             scanf("%d", &menu_option);
  257.  
  258.             switch (menu_option)
  259.             {
  260.                 case 1: printf("n");
  261.                     create_table_personas();
  262.                     break;
  263.                 case 2: printf("n");
  264.                     insert_into_table();
  265.                     break;
  266.                 case 3: printf("n");
  267.                     attribute_search();
  268.                     break;
  269.                 default: printf("n");
  270.                      printf("Opcion invalidan");
  271.                      break;
  272.             }
  273.  
  274.         } while ((menu_option < 1) || (menu_option > 3));
  275.  
  276.         printf("¿Desea realizar otra operacion? (1 Si, 0 No)n");
  277.         scanf ("%d", &menu_on);
  278.  
  279.     } while (menu_on == 1);
  280.  
  281. return (0);
  282.  
  283. }
  284.  
  285.  

Saludos.

Páginas: [1]