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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda Memoria Dinamica
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda Memoria Dinamica  (Leído 3,212 veces)
Pepe2009

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Duda Memoria Dinamica
« en: 13 Agosto 2013, 13:06 pm »

Buenos dias:
 
Necesito leer un fichero de texto de vuelos y otro de pasajeros guardarlo en memoria en un array de registros, y posteriormente gestionarlo de momento he conseguido leer uno y gestionarlo, pero no se como almacenarlo en memoria dinamica para que vaya leyendo todos.
 Los problemas principales es que debo leer de un fichero de texto con los campos separados por almohadillas y la otra duda es que debo almacenar todo el texto en memoria sin saber el numero de registros a almacenar.
 Adjunto programa que ya he hecho por si me podeis echar una mano.
 
Código
  1. #include <stdio.h>
  2.  
  3. typedef struct Reg_Vuelos
  4. {
  5. char IDVuelo[6];
  6. char Operadora[7];
  7. char Aerolinea[5];
  8. char TipoAvion[4];
  9. char NumPasajV[4];
  10. struct Reg_Vuelos *Siguiente;
  11. }Reg_Vuelos;
  12.  
  13. typedef struct Reg_Pasajeros
  14. {
  15. char NumPasajP[4];
  16. char DNI[9];
  17. char Nombre[30];
  18. char Aerolinea[5];
  19. char TipoAvion[4];
  20. char Fecha;
  21. }Reg_Pasajeros;
  22.  
  23. Reg_Vuelos RVuelos;
  24. Reg_Pasajeros RPasajeros;
  25.  
  26.  
  27. int main ()
  28. {
  29. int Var_Aux = 1; // Variable Auxiliar utilizada para recorrer cada uno de los campos del Registro RegVuelos.
  30.  
  31. // Variables utilizadas dentro del bucles que verifica cuantos clientes vuelan el mismo dia.
  32. int p;
  33. int Coincidencias = 0;
  34. int Repeticiones = 0;
  35. int k = 0;
  36. int Avance;
  37.  
  38. char i = 0; // Variable utilizada para rellenar cada uno de los caracteres de los campos del Registro RegVuelos.
  39. char j = 1; // Variable utilizada para rellenar el campo de los vuelos en que no viajan clientes de nuestra operadora.
  40. char Cadena_AuxV[40]; // Cadena Auxiliar para recorrer el Archivo Vuelos.txt.
  41. char Cadena_AuxP[40]; // Cadena Auxiliar para recorrer el Archivo Pasajeros.txt.
  42.  
  43. // Variables utilizadas para Contabilizar los clientes que vuelan en estas Aerolineas.
  44. int Iberia = 0;
  45. int Luftansa = 0;
  46. int American = 0;
  47. int Ryanair = 0;
  48.  
  49. printf ("Ejecutando proceso. \n\n");
  50.  
  51. printf ("Fichero Informe rellenado. Pulse una tecla \n\n");
  52.  
  53. // Apertura de los tres ficheros de texto a utilizar, Vuelos y Pasajeros en modo lectura y el fichero de salida, Informe en modo escritura
  54.  
  55. FILE *Vuelo = fopen("Vuelos.txt", "r");
  56. if (Vuelo == NULL)
  57. {
  58. perror ("Error al abrir fichero.txt");
  59. return -1;
  60. }
  61. FILE *Pasajero = fopen("Pasajeros.txt", "r");
  62. if (Pasajero==NULL)
  63. {
  64. perror ("Error al abrir fichero.txt");
  65. return -1;
  66. }
  67. FILE *Informe = fopen("Informe.txt", "w");
  68. if (Informe==NULL)
  69. {
  70. perror ("Error al abrir fichero.txt");
  71. return -1;
  72. }
  73.  
  74. fprintf (Informe, "Clientes que vuelan mas de dos veces el mismo dia: \n");
  75.  
  76. // Comienza el bucle principal
  77.  
  78. do
  79.  
  80. {
  81.  
  82. Var_Aux = 1;
  83. i = 0;
  84.  
  85. // Leemos una linea completa del fichero Vuelos.txt y la vamos guardando en la estructura registro
  86.  
  87. do
  88. {
  89. Cadena_AuxV[1] = fgetc (Vuelo);
  90. if (Var_Aux == 1)
  91. {
  92. i++;
  93. RVuelos.IDVuelo[i]= Cadena_AuxV[1];
  94. if (Cadena_AuxV[1] == '#')
  95. {
  96. Var_Aux++;
  97. i = 0;
  98. Cadena_AuxV[1] = fgetc (Vuelo);
  99. }
  100. }
  101. if (Var_Aux == 2)
  102. {
  103. i++;
  104. RVuelos.Operadora[i]= Cadena_AuxV[1];
  105. if (Cadena_AuxV[1] == '#')
  106. {
  107. Var_Aux++;
  108. i = 0;
  109. Cadena_AuxV[1] = fgetc (Vuelo);
  110. }
  111. }
  112. if (Var_Aux == 3)
  113. {
  114. i++;
  115. RVuelos.Aerolinea[i]= Cadena_AuxV[1];
  116. if (Cadena_AuxV[1] == '#')
  117. {
  118. Var_Aux++;
  119. i = 0;
  120. Cadena_AuxV[1] = fgetc (Vuelo);
  121. }
  122. }
  123. if (Var_Aux == 4)
  124. {
  125. i++;
  126. RVuelos.TipoAvion[i]= Cadena_AuxV[1];
  127. if (Cadena_AuxV[1] == '#')
  128. {
  129. Var_Aux++;
  130. i = 0;
  131. Cadena_AuxV[1] = fgetc (Vuelo);
  132. }
  133. }
  134. if (Var_Aux == 5)
  135. {
  136. i++;
  137. RVuelos.NumPasajV[i] = Cadena_AuxV[1];
  138. }
  139. }
  140. while (Cadena_AuxV[1] != '\n');
  141.  
  142. // Comprobamos si el cliente es de Nuestra Operadora que Aerolinea ha preferido.
  143.  
  144. if (RVuelos.Operadora[1] == 'N')
  145. {
  146. switch (RVuelos.Aerolinea[1])
  147. {
  148. case 'I':
  149. Iberia ++;
  150. break;
  151. case 'A':
  152. American ++;
  153. break;
  154. case 'R':
  155. Ryanair ++;
  156. break;
  157. case 'L':
  158. Luftansa ++;
  159. break;
  160. }
  161. }
  162. else
  163. {
  164. fprintf (Informe, "\nVuelo en el que no viajan clientes de nuestra operadora: ");
  165. for (j=1; j<7; j++)
  166. {
  167.  
  168. fprintf (Informe, "%c", RVuelos.IDVuelo[j]);
  169. }
  170. fprintf (Informe, "\n");
  171. }
  172.  
  173. // Este bucle lee el fichero Pasajeros, para comprobar si un cliente vuela varias veces en el mismo dia.
  174.  
  175. do
  176. {
  177. k = 1;
  178.  
  179. do
  180. {
  181. Avance = 0;
  182. Cadena_AuxP[1] = fgetc (Pasajero);
  183. RPasajeros.NumPasajP[k]= Cadena_AuxP[1];
  184.  
  185.  
  186. if (RPasajeros.NumPasajP[k] == RVuelos.NumPasajV[k])
  187. {
  188.  
  189. Coincidencias ++;
  190. if (Coincidencias == 4)
  191. {
  192.  
  193. Repeticiones ++;
  194.  
  195.  
  196.  
  197. Coincidencias = 0;
  198. if (Repeticiones == 2)
  199. {
  200. while (Cadena_AuxP[1] != '#')
  201. {
  202. Cadena_AuxP[1] = fgetc (Pasajero);
  203. }
  204. for (p = 1; p<10; p++)
  205. {
  206. Cadena_AuxP[1] = fgetc (Pasajero);
  207. RPasajeros.DNI[p]= Cadena_AuxP[1];
  208. fprintf (Informe,"%c", RPasajeros.DNI[p]);
  209.  
  210. }
  211. Cadena_AuxP[1] = fgetc (Pasajero);
  212. fprintf(Informe,"\n");
  213. Repeticiones = 0;
  214.  
  215. for (p = 1; p<14; p++)
  216. {
  217. Cadena_AuxP[1] = fgetc (Pasajero);
  218. RPasajeros.Nombre[p]= Cadena_AuxP[1];
  219. fprintf (Informe, "%c", RPasajeros.Nombre[p]);
  220. }
  221. fprintf (Informe,"\n");
  222. Avance = 1;
  223. for (p = 1; p<13; p++){
  224. Cadena_AuxP[1] = fgetc (Pasajero); }
  225. }
  226.  
  227. }
  228.  
  229. }
  230. else
  231. {
  232. Coincidencias = 0;
  233. }
  234. k ++;
  235.  
  236. }
  237. while (k < 5);
  238. if (Avance != 1)
  239. {for (p = 1; p<37; p++){
  240. Cadena_AuxP[1] = fgetc (Pasajero);}}
  241. }
  242. while ((Cadena_AuxP[1]=fgetc(Pasajero)) != EOF);
  243.  
  244.  
  245.  
  246.  
  247.  
  248. }
  249. while ((Cadena_AuxV[1]=fgetc(Vuelo)) != EOF);
  250.  
  251.  
  252. fclose (Vuelo);
  253. fclose (Pasajero);
  254. fclose (Informe);
  255. getch();
  256. system ("PAUSE");
  257. return 0;
  258. }


« Última modificación: 13 Agosto 2013, 17:06 pm por Pepe2009 » En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Duda Memoria Dinamica
« Respuesta #1 en: 13 Agosto 2013, 14:15 pm »

Buf...

Vaya montón de código. Te recomiendo que edites el post y pongas el código dentro de las etiquetas correspondientes GsSHi (en el modo de edición la pestaña de arriba a la derecha).

Si quieres ir añadiendo registros a un vector de forma dinámica puedes utilizar la función realloc, y para saber cuantos elementos tienes almacenados solo tendrás que incrementar un contador cada vez que añadas un elemento al vector:
Código
  1. int añadir_entero(int **vector, int valor, int *nelementos)
  2. {
  3.    int *aux;
  4.  
  5.    if(!(aux = realloc(*vector,((*nelementos) + 1) * sizeof(int))))
  6.        return 0;
  7.  
  8.    *vector = aux;
  9.  
  10.    (*vector)[*nelementos] = valor;
  11.    (*nelementos)++;
  12.  
  13.    return 1;
  14. }
  15.  

¡Saludos!


« Última modificación: 13 Agosto 2013, 14:18 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda Memoria Dinamica
« Respuesta #2 en: 13 Agosto 2013, 14:25 pm »

Un realloc es una operación muy costosa, yo lo haría de forma amortiguada. Es decir, de 10 en 10:

Código
  1. int añadir_entero(int **vector, int valor, int *nelementos)
  2. {
  3.    static int Actual = 0;
  4.  
  5.    if (Actual == 10)
  6.    {
  7.      int *aux;
  8.  
  9.      if(!(aux = realloc(*vector,((*nelementos) + 10) * sizeof(int))))
  10.          return 0;
  11.  
  12.      *vector = aux;
  13.      (*nelementos) += 10;
  14.      Actual = 0;
  15.    }
  16.  
  17.    (*vector)[*nelementos-(10-Actual)] = valor;
  18.    Actual++;
  19.  
  20.    return 1;
  21. }
« Última modificación: 13 Agosto 2013, 14:27 pm por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Duda Memoria Dinamica
« Respuesta #3 en: 13 Agosto 2013, 15:02 pm »

Hum...

No es por meter el dedo en el ojo  >:D, pero... y si utilizas la funcion con distintos vectores,desde distintas partes del codigo...  la función puede fallar:

9 llamadas con un vector, 1 llamada con otro, y si repetimos la secuencia, nos salimos de la memoria asignada con el primer vector...

Y la primera llamada debería de reservar memoria, seria Actual = 10, ¿No?

Lo siento, tengo el día vacilón. Demasiada calor...

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Pepe2009

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Duda Memoria Dinamica
« Respuesta #4 en: 13 Agosto 2013, 17:30 pm »

El enunciado es el siguiente,

Para mejorar la atención al público de nuestra operadora de viajes de negocios debemos desarrollar una aplicación que transforme y estudie el fichero que, sobre el tráfico aéreo europeo, publica Eurocontrol. El fichero que recibimos de Eurocontrol es un fichero diario de texto con el siguiente formato:
   Nº vuelos
   IDVuelo#Operadora#Aerolínea#TipoAvión#NºPasajeros
   IDVuelo#Operadora#Aerolínea#TipoAvión#NºPasajeros
   ………
Para la gestión de la web de nuestra operadora disponemos de otro fichero en modo texto con el siguiente formato:
   Nº pasajeros
   DNI#Nombre#Aerolínea#TipoAvión#Fecha
   DNI#Nombre#Aerolínea#TipoAvión#Fecha
   ………
La práctica consistirá en implementar una aplicación que recibirá el nombre de los dos ficheros como argumentos y transformará los archivos de datos en una estructura de datos en memoria de la forma siguiente:
 

Una vez creada la estructura de la figura anterior, el programa emitirá un informe que almacenará en un fichero de texto. El informe constará de un listado de los vuelos en los que no viajan clientes de nuestra operadora, el nombre de la aerolínea en la que más vuelan nuestros clientes y el nombre y el DNI de los clientes que aparezcan más de una vez en la estructura, es decir, de aquellos clientes que ese día viajen en avión más de una vez.
El acceso a ficheros y el uso de memoria deberán ser lo más eficientes posibles. El programa deberá estar correctamente estructurado en distintos ficheros con sus correspondientes cabeceras.
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Duda Memoria Dinamica
« Respuesta #5 en: 13 Agosto 2013, 17:42 pm »

 :¬¬

No te vamos a hacer el trabajo. Has empezado bien, planteando una duda en concreto y te hemos dado dos soluciones alternativas, pero no pretendas que se te haga el trabajo.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Pepe2009

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Duda Memoria Dinamica
« Respuesta #6 en: 13 Agosto 2013, 17:59 pm »

Por supuesto, no es lo que pretendo, dime como aprendo yo si el trabajo lo haces tu.
  :-[

Si he puesto las aclaraciones es por que he entendido que me lo decias asi, pero no te preocupes, dentro de un rato lo borro y continuo por mi cuenta.

Gracias por los consejos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[DUDA] Memoria Dinámica en C++
Programación C/C++
Zodiak98 3 2,626 Último mensaje 5 Junio 2013, 18:48 pm
por Zodiak98
Duda sobre memoria dinamica C++
Programación C/C++
erest0r 6 3,944 Último mensaje 11 Septiembre 2013, 09:34 am
por erest0r
Duda con memoria dinámica y arrays
Programación C/C++
Bob1098 6 2,534 Último mensaje 7 Septiembre 2015, 18:47 pm
por Bob1098
Duda con memoria dinamica
Programación C/C++
Ja_90 2 1,798 Último mensaje 20 Octubre 2015, 19:17 pm
por Ja_90
[C] (Consulta) Duda cuando un programa en C termina y memoria dinámica
Programación C/C++
class_OpenGL 4 2,520 Último mensaje 29 Mayo 2016, 21:19 pm
por class_OpenGL
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines