Autor
|
Tema: Problema para leer archivo .txt (Leído 2,036 veces)
|
Jesusinfo
Desconectado
Mensajes: 38
Copartícipe del conocimiento
|
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... #include <iostream> #include <fstream> using namespace std; void llenar (int notas [], struct lista_estudiantes[]); void imprimir (int notas [],struct lista_estudiantes[]); int menu (); int num; int asignatura=5; string nombres[100]; int posicionesEstudiante=0; struct lista_estudiantes{ string nombres, apellido; char cedula[11]; int DD, MM, AAAA; //char DD[2],MM[2],AAAA[4]; }estudiantes[100]; //Funcion que indica la n cantidad de estudiantes y sus notas ---------------------------- 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. system("cls"); int i, x; ofstream registrar; registrar.open ("registro.txt",ios::out|ios::app); if(!registrar){ cout<<"PROBLEMA AL ABRIR EL ARCHIVO"<<endl; } if (registrar.fail()){ cout<<"ERROR AL ABRIR EL ARCHIVO"<<endl; system ("pause"); } else { cout<<"INDIQUE EL NUMERO DE ESTUDIANTES A UTILIZAR EN EL PROGRAMA: "<<endl<<endl; cin>>num; cout<<endl; for(i=0; i<=num-1; i++){ cout<<"\nLLENE LOS DATOS DEL ESTUDIANTE "<<i+1<<endl<<endl; cout<<"\nNOMBRE: "; cin>>estudiantes[i].nombres; cout<<"\nAPELLIDO: "; cin>>estudiantes[i].apellido; cout<<"\nC.I: "; cin>>estudiantes[i].cedula; cout<<"\nFECHA DE NACIMIENTO"<<endl; cout<<"\nDIA (DD): "; cin>>estudiantes[i].DD; cout<<"\nMES (MM): "; cin>>estudiantes[i].MM; cout<<"\nANHO (AAAA): "; cin>>estudiantes[i].AAAA; cout<<"\n_____________________ "<<endl; cout<<"\nINGRESE LAS NOTAS DE "<<estudiantes[i].apellido<<endl; registrar<<"NOMBRE: "<<estudiantes[i].nombres<<endl; registrar<<"APELLIDO: "<<estudiantes[i].apellido<<endl; registrar<<"C.I: "<<estudiantes[i].cedula<<endl; registrar<<"FECHA DE NACIMIENTO: "<<estudiantes[i].DD<<"/"<<estudiantes[i].MM<<"/"<<estudiantes[i].AAAA<<"\n"<<endl; for (x=0; x<asignatura; x++){ cout<<"\nNOTA "<<x+1<<": "; cin>>notas[asignatura*i+x]; registrar<<"NOTA "<<x+1<<": "<<notas[asignatura*i+x]<<endl; } cout<<endl<<endl; registrar<<"\n________________________________\n"<<endl; } registrar.close(); system ("pause"); } } void imprimir (int notas [], lista_estudiantes[]){ system("cls"); ifstream visualizar; int cont=0; int cont2=0; visualizar.open("registro.txt"); for(int i=0;i<num-1;i++){ visualizar>>estudiantes[i].nombres; visualizar>>estudiantes[i].apellido; visualizar>>estudiantes[i].cedula; visualizar>>estudiantes[i].DD; cout<<estudiantes[i].MM<<endl; cout<<estudiantes[i].AAAA<<endl; 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; for(int x=0; x<asignatura;x++){ visualizar>>notas[asignatura*i+x]; cout<<notas[asignatura*i+x]; } } visualizar.close(); system ("pause"); } //Menu ------------------------------------------------------------- int menu (){ system("cls"); int opc; 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; cin>>opc; cout<<"\n"; if(opc>7){ cout<<"LA OPCION ["<<opc<<"] NO EXISTE\n\n"<<endl; system ("pause"); } return opc; } int main(){ int notas[500]; int opc; do{ opc=menu(); switch (opc){ case 1: llenar(notas,estudiantes); break; case 2: imprimir(notas, estudiantes); break; case 3: system("cls"); cout<<"\n\nBYE BYE\n"<<endl; break; } } while (opc !=3); system ("pause"); }
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
Mensajes: 32
|
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. #include <iostream> #include <fstream> using namespace std; void llenar (int notas [], struct lista_estudiantes[]); void imprimir (int notas [],struct lista_estudiantes[]); int menu (); int num; int asignatura=5; string nombres[100]; int posicionesEstudiante=0; struct lista_estudiantes{ string nombres, apellido; char cedula[11]; int DD, MM, AAAA; //char DD[2],MM[2],AAAA[4]; }estudiantes[100]; //Funcion que indica la n cantidad de estudiantes y sus notas ---------------------------- 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. int i, x; fstream registrar; registrar.open ("registro.txt",ios::out|ios::app); if(!registrar){ cout<<"PROBLEMA AL ABRIR EL ARCHIVO"<<endl; } if (registrar.fail()){ cout<<"ERROR AL ABRIR EL ARCHIVO"<<endl; } else { cout<<"INDIQUE EL NUMERO DE ESTUDIANTES A UTILIZAR EN EL PROGRAMA: "<<endl<<endl; cin>>num; cout<<endl; for(i=0; i<num; i++){ cout<<"\nLLENE LOS DATOS DEL ESTUDIANTE "<<i+1<<endl<<endl; cout<<"\nNOMBRE: "; cin>>estudiantes[i].nombres; cout<<"\nAPELLIDO: "; cin>>estudiantes[i].apellido; cout<<"\nC.I: "; cin>>estudiantes[i].cedula; cout<<"\nFECHA DE NACIMIENTO"<<endl; cout<<"\nDIA (DD): "; cin>>estudiantes[i].DD; cout<<"\nMES (MM): "; cin>>estudiantes[i].MM; cout<<"\nANHO (AAAA): "; cin>>estudiantes[i].AAAA; cout<<"\n_____________________ "<<endl; cout<<"\nINGRESE LAS NOTAS DE "<<estudiantes[i].apellido<<endl; registrar<<"NOMBRE: "<<estudiantes[i].nombres<<endl; registrar<<"APELLIDO: "<<estudiantes[i].apellido<<endl; registrar<<"C.I: "<<estudiantes[i].cedula<<endl; registrar<<"FECHA DE NACIMIENTO: "<<estudiantes[i].DD<<"/"<<estudiantes[i].MM<<"/"<<estudiantes[i].AAAA<<"\n"<<endl; for (x=0; x<asignatura; x++){ cout<<"\nNOTA "<<x+1<<": "; cin>>notas[asignatura*i+x]; registrar<<"NOTA "<<x+1<<": "<<notas[asignatura*i+x]<<endl; } cout<<endl<<endl; registrar<<"\n________________________________\n"<<endl; } registrar.close(); } } void imprimir (int notas [], lista_estudiantes[]){ ifstream visualizar; int cont=0; int cont2=0; visualizar.open("registro.txt"); for(int i=0;i<num;i++){ visualizar>>estudiantes[i].nombres; visualizar>>estudiantes[i].apellido; visualizar>>estudiantes[i].cedula; visualizar>>estudiantes[i].DD; visualizar>>estudiantes[i].MM; visualizar>>estudiantes[i].AAAA; cout<<estudiantes[i].nombres<<endl<<estudiantes[i].apellido<<endl<<estudiantes[i].cedula<<endl<<estudiantes[i].DD<<"/"<<estudiantes[i].MM<<"/"<<estudiantes[i].AAAA<<endl; for(int x=0; x<asignatura;x++){ visualizar>>notas[asignatura*i+x]; cout<<notas[asignatura*i+x]; } } visualizar.close(); } //Menu ------------------------------------------------------------- int menu (){ int opc; 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; cin>>opc; cout<<"\n"; if(opc>7){ cout<<"LA OPCION ["<<opc<<"] NO EXISTE\n\n"<<endl; } return opc; } int main(){ int notas[500]; int opc; do{ opc=menu(); switch (opc){ case 1: llenar(notas,estudiantes); break; case 2: imprimir(notas, estudiantes); break; case 3: cout<<"\n\nBYE BYE\n"<<endl; break; } } while (opc !=3); }
|
|
« Última modificación: 10 Noviembre 2016, 00:16 am por eduardo1012 »
|
En línea
|
|
|
|
Jesusinfo
Desconectado
Mensajes: 38
Copartícipe del conocimiento
|
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
Mensajes: 32
|
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. #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> void archivo(); main(){ archivo(); getch(); } void archivo(){ int i,idd,existenciaa; char nombree[20],fechaa[20]; FILE *ptr; ptr = fopen("150941_Aguilar_Av1-2.txt", "r"); do{ fscanf(ptr,"%d",&idd); fscanf(ptr,"%s",nombree); fscanf(ptr,"%s",fechaa); fscanf(ptr,"%d",&existenciaa); printf("%d\n",idd); printf("%s\n",nombree); printf("%s\n",fechaa); printf("%d\n",existenciaa); printf("\n"); i++; }while(!feof(ptr)); fclose(ptr); printf("Registros guardados %d\n",i); }
código txt llamado :150941_Aguilar_Av1-2 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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema al leer un archivo XML (Solucionado)
.NET (C#, VB.NET, ASP)
|
Zeroql
|
3
|
4,118
|
12 Julio 2010, 15:31 pm
por Zeroql
|
|
|
Problema en C++ al leer archivo .txt
« 1 2 »
Programación C/C++
|
javier_SL
|
10
|
13,272
|
21 Junio 2011, 00:54 am
por Danyel_Casvill
|
|
|
Problema Al leer Archivo En C
Programación C/C++
|
ZedGe
|
3
|
6,364
|
22 Enero 2012, 11:27 am
por Xandrete
|
|
|
Problema al leer archivo en Java
Java
|
thekill01
|
1
|
2,662
|
27 Mayo 2012, 03:02 am
por [Case]
|
|
|
problema al leer archivo
Programación C/C++
|
m@o_614
|
2
|
1,840
|
2 Marzo 2014, 13:25 pm
por vangodp
|
|