Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Jesusinfo en 9 Noviembre 2016, 04:42 am



Título: Problema para leer archivo .txt
Publicado por: Jesusinfo en 9 Noviembre 2016, 04:42 am
Buenas noches compañeros, estoy estancadisimo en este problema, ojala puedan ayudarme. Mi problema es el siguiente, creo un programa el cual permita crear un archivo con struct y arrays, del cual sus datos se crean perfectamente y se almacenan en el archivo correctamente, pero a la hora de leer el archivo en el programa no se muestra nada en el programa, estoy muy seguro que lo estoy planteando mal. Quisiera saber si esto se puede resolver sin la utilizacion de punteros...
Código
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. void llenar (int notas [], struct lista_estudiantes[]);
  6. void imprimir (int notas [],struct lista_estudiantes[]);
  7. int menu ();
  8.  
  9. int num;
  10. int asignatura=5;
  11. string nombres[100];
  12. int posicionesEstudiante=0;
  13.  
  14. struct lista_estudiantes{
  15. string nombres, apellido;
  16. char cedula[11];
  17. int DD, MM, AAAA;
  18. //char DD[2],MM[2],AAAA[4];
  19. }estudiantes[100];
  20. //Funcion que indica la n cantidad de estudiantes y sus notas ----------------------------
  21.  
  22. void llenar (int notas [], lista_estudiantes[]){ //Asumo que paso por parametros la estructura al nombrarla en los parametros, sin pasarla en forma de referencia o valor.
  23. system("cls");
  24.  
  25. int i, x;
  26. ofstream registrar;
  27. registrar.open ("registro.txt",ios::out|ios::app);
  28. if(!registrar){
  29. cout<<"PROBLEMA AL ABRIR EL ARCHIVO"<<endl;
  30. }
  31.  
  32.  
  33. if (registrar.fail()){
  34. cout<<"ERROR AL ABRIR EL ARCHIVO"<<endl;
  35. system ("pause");
  36. }
  37. else {
  38.  
  39. cout<<"INDIQUE EL NUMERO DE ESTUDIANTES A UTILIZAR EN EL PROGRAMA: "<<endl<<endl;
  40. cin>>num;
  41. cout<<endl;
  42.  
  43. for(i=0; i<=num-1; i++){
  44. cout<<"\nLLENE LOS DATOS DEL ESTUDIANTE "<<i+1<<endl<<endl;
  45. cout<<"\nNOMBRE: ";
  46. cin>>estudiantes[i].nombres;
  47. cout<<"\nAPELLIDO: ";
  48. cin>>estudiantes[i].apellido;
  49. cout<<"\nC.I: ";
  50. cin>>estudiantes[i].cedula;
  51. cout<<"\nFECHA DE NACIMIENTO"<<endl;
  52. cout<<"\nDIA (DD): ";
  53. cin>>estudiantes[i].DD;
  54. cout<<"\nMES (MM): ";
  55. cin>>estudiantes[i].MM;
  56. cout<<"\nANHO (AAAA): ";
  57. cin>>estudiantes[i].AAAA;
  58. cout<<"\n_____________________ "<<endl;
  59. cout<<"\nINGRESE LAS NOTAS DE "<<estudiantes[i].apellido<<endl;
  60.  
  61. registrar<<"NOMBRE: "<<estudiantes[i].nombres<<endl;
  62. registrar<<"APELLIDO: "<<estudiantes[i].apellido<<endl;
  63. registrar<<"C.I: "<<estudiantes[i].cedula<<endl;
  64. registrar<<"FECHA DE NACIMIENTO: "<<estudiantes[i].DD<<"/"<<estudiantes[i].MM<<"/"<<estudiantes[i].AAAA<<"\n"<<endl;
  65.  
  66. for (x=0; x<asignatura; x++){
  67. cout<<"\nNOTA "<<x+1<<": ";
  68. cin>>notas[asignatura*i+x];
  69. registrar<<"NOTA "<<x+1<<": "<<notas[asignatura*i+x]<<endl;
  70. }
  71. cout<<endl<<endl;
  72. registrar<<"\n________________________________\n"<<endl;
  73. }
  74. registrar.close();
  75. system ("pause");
  76. }
  77.  
  78. }
  79.  
  80.  
  81. void imprimir (int notas [], lista_estudiantes[]){
  82. system("cls");
  83. ifstream visualizar;
  84. int cont=0;
  85. int cont2=0;
  86. visualizar.open("registro.txt");
  87.  
  88. for(int i=0;i<num-1;i++){
  89. visualizar>>estudiantes[i].nombres;
  90. visualizar>>estudiantes[i].apellido;
  91. visualizar>>estudiantes[i].cedula;
  92. visualizar>>estudiantes[i].DD;
  93. cout<<estudiantes[i].MM<<endl;
  94. cout<<estudiantes[i].AAAA<<endl;
  95. cout<<estudiantes[i].nombres<<"\n"<<estudiantes[i].apellido<<"\n"<<estudiantes[i].cedula<<"\n"<<estudiantes[i].DD<<"/"<<estudiantes[i].MM<<"\n"<<estudiantes[i].AAAA<<"\n"<<endl;
  96. for(int x=0; x<asignatura;x++){
  97. visualizar>>notas[asignatura*i+x];
  98. cout<<notas[asignatura*i+x];
  99. }
  100. }
  101. visualizar.close();
  102. system ("pause");
  103. }
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112. //Menu -------------------------------------------------------------
  113. int menu (){
  114. system("cls");
  115. int opc;
  116. cout<<"MENU DEL PROGRAMA\n-----------------------------------------------\n\n[1] INGRESAR EL NUMERO DE ESTUDIANTES\n\n[2] VISUALIZAR LOS DATOS DE LOS ESTUDIANTES\n\n[3] SALIR DEL PROGRAMA\n"<<endl;
  117. cin>>opc;
  118. cout<<"\n";
  119. if(opc>7){
  120. cout<<"LA OPCION ["<<opc<<"] NO EXISTE\n\n"<<endl;
  121. system ("pause");
  122. }
  123.  
  124. return opc;
  125. }
  126.  
  127.  
  128. int main(){
  129.  
  130. int notas[500];
  131. int opc;
  132. do{
  133. opc=menu();
  134. switch (opc){
  135. case 1:
  136. llenar(notas,estudiantes);
  137. break;
  138.  
  139. case 2:
  140. imprimir(notas, estudiantes);
  141. break;
  142.  
  143. case 3:
  144. system("cls");
  145. cout<<"\n\nBYE BYE\n"<<endl;
  146. break;
  147. }
  148. }
  149. while (opc !=3);
  150. system ("pause");
  151. }
  152.  

Un saludo y muchas gracias de antemano por leer el post.


Título: Re: Problema para leer archivo .txt
Publicado por: eduardo1012 en 10 Noviembre 2016, 00:11 am
El programa si muestra algo, aunque imprime basura, los estas imprimiendo mal, no conozco acerca de ifstrem y ello, y el programa funcionara correctamente cuando cree el primer archivo, es decir que no abra uno que ya este creado. A menos que le cambies ese num en el de leer hasta que no encuentre mas caracteres, algo como feof.
Por cierto en los for los declaras como <=, los he modificado y me ha impreso.

Talvez deberías intentar con fprintf, me parece mucho mas fácil de entender y simple. Solo que como primer argumento se le pasa el puntero al archivo.
Código
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. void llenar (int notas [], struct lista_estudiantes[]);
  5. void imprimir (int notas [],struct lista_estudiantes[]);
  6. int menu ();
  7. int num;
  8. int asignatura=5;
  9. string nombres[100];
  10. int posicionesEstudiante=0;
  11.  
  12. struct lista_estudiantes{
  13. string nombres, apellido;
  14. char cedula[11];
  15. int DD, MM, AAAA;
  16. //char DD[2],MM[2],AAAA[4];
  17. }estudiantes[100];
  18. //Funcion que indica la n cantidad de estudiantes y sus notas ----------------------------
  19.  
  20. void llenar (int notas [], lista_estudiantes[]){ //Asumo que paso por parametros la estructura al nombrarla en los parametros, sin pasarla en forma de referencia o valor.
  21. system("cls");
  22.  
  23. int i, x;
  24. fstream registrar;
  25. registrar.open ("registro.txt",ios::out|ios::app);
  26. if(!registrar){
  27. cout<<"PROBLEMA AL ABRIR EL ARCHIVO"<<endl;
  28. }
  29.  
  30.  
  31. if (registrar.fail()){
  32. cout<<"ERROR AL ABRIR EL ARCHIVO"<<endl;
  33. system ("pause");
  34. }
  35. else {
  36.  
  37. cout<<"INDIQUE EL NUMERO DE ESTUDIANTES A UTILIZAR EN EL PROGRAMA: "<<endl<<endl;
  38. cin>>num;
  39. cout<<endl;
  40.  
  41. for(i=0; i<num; i++){
  42. cout<<"\nLLENE LOS DATOS DEL ESTUDIANTE "<<i+1<<endl<<endl;
  43. cout<<"\nNOMBRE: ";
  44. cin>>estudiantes[i].nombres;
  45. cout<<"\nAPELLIDO: ";
  46. cin>>estudiantes[i].apellido;
  47. cout<<"\nC.I: ";
  48. cin>>estudiantes[i].cedula;
  49. cout<<"\nFECHA DE NACIMIENTO"<<endl;
  50. cout<<"\nDIA (DD): ";
  51. cin>>estudiantes[i].DD;
  52. cout<<"\nMES (MM): ";
  53. cin>>estudiantes[i].MM;
  54. cout<<"\nANHO (AAAA): ";
  55. cin>>estudiantes[i].AAAA;
  56. cout<<"\n_____________________ "<<endl;
  57. cout<<"\nINGRESE LAS NOTAS DE "<<estudiantes[i].apellido<<endl;
  58.  
  59. registrar<<"NOMBRE: "<<estudiantes[i].nombres<<endl;
  60. registrar<<"APELLIDO: "<<estudiantes[i].apellido<<endl;
  61. registrar<<"C.I: "<<estudiantes[i].cedula<<endl;
  62. registrar<<"FECHA DE NACIMIENTO: "<<estudiantes[i].DD<<"/"<<estudiantes[i].MM<<"/"<<estudiantes[i].AAAA<<"\n"<<endl;
  63.  
  64. for (x=0; x<asignatura; x++){
  65. cout<<"\nNOTA "<<x+1<<": ";
  66. cin>>notas[asignatura*i+x];
  67. registrar<<"NOTA "<<x+1<<": "<<notas[asignatura*i+x]<<endl;
  68. }
  69. cout<<endl<<endl;
  70. registrar<<"\n________________________________\n"<<endl;
  71. }
  72. registrar.close();
  73. system ("pause");
  74. }
  75.  
  76. }
  77.  
  78.  
  79. void imprimir (int notas [], lista_estudiantes[]){
  80. system("cls");
  81. ifstream visualizar;
  82. int cont=0;
  83. int cont2=0;
  84. visualizar.open("registro.txt");
  85.  
  86. for(int i=0;i<num;i++){
  87. visualizar>>estudiantes[i].nombres;
  88. visualizar>>estudiantes[i].apellido;
  89. visualizar>>estudiantes[i].cedula;
  90. visualizar>>estudiantes[i].DD;
  91. visualizar>>estudiantes[i].MM;
  92. visualizar>>estudiantes[i].AAAA;
  93.  
  94. cout<<estudiantes[i].nombres<<endl<<estudiantes[i].apellido<<endl<<estudiantes[i].cedula<<endl<<estudiantes[i].DD<<"/"<<estudiantes[i].MM<<"/"<<estudiantes[i].AAAA<<endl;
  95. for(int x=0; x<asignatura;x++){
  96. visualizar>>notas[asignatura*i+x];
  97. cout<<notas[asignatura*i+x];
  98. }
  99. }
  100. visualizar.close();
  101. system ("pause");
  102. }
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111. //Menu -------------------------------------------------------------
  112. int menu (){
  113. system("cls");
  114. int opc;
  115. cout<<"MENU DEL PROGRAMA\n-----------------------------------------------\n\n[1] INGRESAR EL NUMERO DE ESTUDIANTES\n\n[2] VISUALIZAR LOS DATOS DE LOS ESTUDIANTES\n\n[3] SALIR DEL PROGRAMA\n"<<endl;
  116. cin>>opc;
  117. cout<<"\n";
  118. if(opc>7){
  119. cout<<"LA OPCION ["<<opc<<"] NO EXISTE\n\n"<<endl;
  120. system ("pause");
  121. }
  122.  
  123. return opc;
  124. }
  125.  
  126.  
  127. int main(){
  128.  
  129. int notas[500];
  130. int opc;
  131. do{
  132. opc=menu();
  133. switch (opc){
  134. case 1:
  135. llenar(notas,estudiantes);
  136. break;
  137.  
  138. case 2:
  139. imprimir(notas, estudiantes);
  140. break;
  141. case 3:
  142. system("cls");
  143. cout<<"\n\nBYE BYE\n"<<endl;
  144. break;
  145. }
  146. }
  147. while (opc !=3);
  148. system ("pause");
  149. }


Título: Re: Problema para leer archivo .txt
Publicado por: Jesusinfo en 10 Noviembre 2016, 01:04 am
Entiendo amigo, y es correcto imprime el código que me enviaste, una vez que ingresa los datos, pero el error se encuentra al momento de cerrar y abrir el programa nuevamente, se supone que ya existe un archivo la segunda vez que se abra el programa, y se supone que deberia visualizarse la informacion puesta con anterioridad pero no sucede, y es ahi donde radica mi pregunta que estoy planteando mal, he visto videos, que hacen una lectura anticipada antes del bucle while(!archivo.eof). pero no he encontrado uno planteado con arrays, ya que trabajo con ciclos for, y pues me complico un poco :(


Título: Re: Problema para leer archivo .txt
Publicado por: eduardo1012 en 10 Noviembre 2016, 01:26 am
Bueno la primera vez te muestra "correctamente" cuantos registros existen en el archivo porque conoce cuantos hay. Pero cuando lo cierras y vuelves a abrir el programa y quieres conocer esos registros tu programa no sabe cuantos existen, dado que antes ya habias ingresado por lo que num = 0. Si antes tenias 2 , los imprimes y los muestra, pero lo cierras y vuelves abrirlo y agregas 2, tu sabes que tienes 4, pero el programa sabe que num = 2, por lo que no sigue correctamente. Aquí te muestro un ejemplo de como leer un archivo.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <string.h>
  5.  
  6. void archivo();
  7.  
  8. main(){
  9. archivo();
  10. getch();
  11. }
  12.  
  13. void archivo(){
  14. int i,idd,existenciaa;
  15. char nombree[20],fechaa[20];
  16. FILE *ptr;
  17. ptr = fopen("150941_Aguilar_Av1-2.txt", "r");
  18.  
  19.   do{
  20.   fscanf(ptr,"%d",&idd);
  21.   fscanf(ptr,"%s",nombree);
  22.   fscanf(ptr,"%s",fechaa);
  23.   fscanf(ptr,"%d",&existenciaa);
  24. printf("%d\n",idd);
  25. printf("%s\n",nombree);
  26. printf("%s\n",fechaa);
  27. printf("%d\n",existenciaa);
  28.   printf("\n");
  29. i++;      
  30.   }while(!feof(ptr));
  31. fclose(ptr);  
  32. printf("Registros guardados %d\n",i);
  33. }
código txt llamado :150941_Aguilar_Av1-2
Código:
1
leche
20-12-2016
10
2
arroz
22/02/2017
8
3
Huevos
25/11/2016
8
4
frijoles
29/12/2017
12
5
maiz
31/03/2017
8
6
papas
20/03/2017
8
7
caramelos
08/09/2022
15
8
gelatina
09/20/2027
15
9
refresco
09/09/2019
18
10
harina
22/05/2018
15
11
Carne
10/04/2017
15