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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema para leer archivo .txt
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema para leer archivo .txt  (Leído 1,817 veces)
Jesusinfo

Desconectado Desconectado

Mensajes: 38


Copartícipe del conocimiento


Ver Perfil
Problema para leer archivo .txt
« 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.


« Última modificación: 9 Noviembre 2016, 04:56 am por Jesusinfo » En línea

eduardo1012

Desconectado Desconectado

Mensajes: 32


Ver Perfil
Re: Problema para leer archivo .txt
« Respuesta #1 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. }


« Última modificación: 10 Noviembre 2016, 00:16 am por eduardo1012 » En línea

Jesusinfo

Desconectado Desconectado

Mensajes: 38


Copartícipe del conocimiento


Ver Perfil
Re: Problema para leer archivo .txt
« Respuesta #2 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 :(
En línea

eduardo1012

Desconectado Desconectado

Mensajes: 32


Ver Perfil
Re: Problema para leer archivo .txt
« Respuesta #3 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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema al leer un archivo XML (Solucionado)
.NET (C#, VB.NET, ASP)
Zeroql 3 3,916 Último mensaje 12 Julio 2010, 15:31 pm
por Zeroql
Problema en C++ al leer archivo .txt « 1 2 »
Programación C/C++
javier_SL 10 12,562 Último mensaje 21 Junio 2011, 00:54 am
por Danyel_Casvill
Problema Al leer Archivo En C
Programación C/C++
ZedGe 3 6,085 Último mensaje 22 Enero 2012, 11:27 am
por Xandrete
Problema al leer archivo en Java
Java
thekill01 1 2,519 Último mensaje 27 Mayo 2012, 03:02 am
por [Case]
problema al leer archivo
Programación C/C++
m@o_614 2 1,665 Último mensaje 2 Marzo 2014, 13:25 pm
por vangodp
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines