Saludos,
Tengo un problema a la hora de cargar datos de un archivo y agregarlos a un vector, me duplica los datos.
la metodologia es la siguiente se abre el .exe, se registrar los datos de los alumnos, se guardan al archivo, se cierra el .exe, se vuelve abrir se cargan los datos del archivo, se agregan al vector, y despues se registran nuevos estudiante.
el problema sucede cuando se toman los datos del archivo ya que este toma el salto de linea, he intendo poner un '\n' pero nada.
Código:
#include <iostream>
#include <vector>
#include <fstream>
#include <windows.h>
#include <sstream> //convertir int a string
using namespace std;
struct estudiante
{
string codigo, nombre, dir, email;
int id, tel;
}e;
struct profe
{
string codigo, nombre, dir, email;
int id, tel;
}p;
struct materia
{
string nombre, codAsi;
}m;
struct notas{
string codMateria, codAlumno;
float nota;
}n;
vector<estudiante> vestudiantes; //almacena los datos de los estudiantes
vector<profe> vprofe; //almacena los datos de los profesores
vector<materia> vmateria; //almacena los datos de las materias (nombre y a que profe estan a que profe esta destinado)
vector<notas> vnota; //asigna los cod_Estudiante
fstream d;
bool menu();
bool guardar();
string intAstring(int);
int stringAint(string);
void registro();
void registrarAlumno();
void registrarDocente();
void registrarMateria();
void registrarNotas();
void cargar();
int main(){
bool salir;
do{
salir = menu();
}while(!salir);
system("pause");
return 0;
}
bool menu(){
bool salir; int op;
cout<<"\n\n\t\t********Bienvenido*******"<<endl;
cout<<"\t\t***MENU PRINCIPAL*****"<<endl;
cout<<"1. Registro (alumnos, docentes, materias, asignaturas, guardar archvivos"<<endl;
cout<<"2. Cargar los datos de los vectores"<<endl;
cin>>op;
switch(op){
case 1:
system("cls");
cout<<"\n\n";
registro();
system("cls");
break;
case 2:
cargar();
break;
case 3:
cout<<"gracias"<<endl;
salir = true;
break;
}
return salir;
}
void cargar(){
//se valida que los vectores haya informacion
vestudiantes.clear(); //se limpia el vector
d.open("datos_estudiantes.txt", ios::in);
if(!d.is_open()){
cout<<"Error, archivo no encontrado, para crearlo registre datos de estudiantes"<<endl;
d.close();
}else{
string linea, linea1; //tomara los datos del archivo
char s=',';//separador
//int n =0; //contador para las lineas que tengan datos (no me funciono)
while(!d.eof()){
getline(d, linea1, s);
e.id = stringAint(linea);
getline(d, e.codigo, s);
getline(d, e.nombre, s);
getline(d, e.dir, s);
getline(d, linea, s);
e.tel = stringAint(linea);
getline(d, linea);
e.email = linea;
vestudiantes.push_back(e); //se agregan los valores encontrados en el .txt al vector (agrega el salto de linea como pos del vec
}
cout<<"datos de estudiantes cargados"<<endl;
d.close();
cout<<"tamano del vector al salir de carga"<<vestudiantes.size()<<endl; //sale con una posicion de mas que es el salto de linea
//que se agrega a la hora de guardar los datos al archivos
}/*
d.open("datos_docentes.txt",ios::in);
if(!d.is_open()){
cout<<"Error, archivo no encontrado, para crearlo registre datos de docentes"<<endl;
d.close();
}else{
string linea; //tomara los datos del archivo
char s=',';//separador
while(!d.eof()){
getline(d, p.nombre, s);
getline(d, p.dir, s);
getline(d, p.email, s);
getline(d, linea, s);
p.id = stringAint(linea);
p.tel = stringAint(linea);
vestudiantes.push_back(e); //se llenan los valores encontrados en el .txt al vector
}
cout<<"datos de docentes cargados"<<endl;
d.close();
}
d.open("datos_materias.txt",ios::in);
if(!d.is_open()){
cout<<"Error, archivo no encontrado, para crearlo registre datos de docentes"<<endl;
}else{
string linea;
char s= ',';
while(!d.eof()){
getline(d, m.nombre, s);
getline(d, m.codAsi);
vmateria.push_back(m);
}
cout<<"datos de materias.txt cargado"<<endl;
d.close();
}*/
}
void registro()
{
int op;
do{
cout<<"\t\t*******ESTAS EN REGISTRO******"<<endl;
cout<<"1. Registrar datos de alumnos"<<endl;
cout<<"2. Registrar datos de docentes"<<endl;
cout<<"3. Registrar datos de Materias"<<endl;
cout<<"4. Registrar Notas de los alumnos"<<endl;
cout<<"5. Guardar los datos a archivos"<<endl;
cout<<"6. Atras"<<endl;
cout<<"Elija una opcion "; cin>>op;
switch (op){
case 1:
system("cls");
registrarAlumno();
cout<<"***DATOS DE"<<vestudiantes.size()<<" ESTUDIANTES AGREGADOS***"<<endl;
system("pause");
system("cls");
break;
case 2:
system("cls");
registrarDocente();
cout<<"***DATOS DE DOCENTES AGREGADOS***"<<endl;
system("pause");
system("cls");
break;
case 3:
if(vprofe.size()!=0){
system("cls");
registrarMateria();
cout<<"***DATOS DE MATERIAS AGREGADOS***"<<endl;
system("pause");
system("cls");
}
else{
system("cls");
cout<<"debe cargar los datos o aregar datos de profesores"<<endl;
system("pause");
system("cls");
}
break;
case 4:
system("cls");
registrarNotas();
system("pause");
system("cls");
break;
case 5:
system("cls");
guardar();
cout<<"***datos almacenados***"<<endl;
system("pause");
system("cls");
break;
case 6:
break;
default:
cout<<"op invalida"<<endl;
break;
}
}while(op != 6);
}
void registrarAlumno(){
cout<<"tamaño del vector al entrar a registro"<<vestudiantes.size();
cout<<"\n\t*** ID del estudiante (ejmplo 1050969229): ***\n\n"; cin>>e.id;
cout<<"\n\t*** Codigo del estudiante (ejemplo T02): ***\n\n"; cin>>e.codigo;
cout<<"\n\t*** Nombre del estudiante (ejem: Miguel_Arnedo): ***\n\n"; cin>>e.nombre;
cout<<"\n\t*** a direccion del estudiante: ***\n\n"; cin>>e.dir;
cout<<"\n\t*** telefono del estudiante: ***\n\n"; cin>>e.tel;
cout<<"ingrese el email del estudiante: ***\n\n"; cin>>e.email;
vestudiantes.push_back(e);
cout<<"tama al salir de registro"<<vestudiantes.size()<<endl;
}
void registrarDocente(){
char op='s';
do{
cout<<"ingrese la id del docente (ejmplo 123): "; cin>>p.id;
cout<<"ingrese el codgio del docente (ejemplo D1): "; cin>>p.codigo;
cout<<"ingrese el nombre del docente (ejem: Pepe_La_Costena): "; cin>>p.nombre;
//cout<<"ingrese la direccion del docente: "; cin>>p.dir;
//cout<<"ingrese el telefono del docente: "; cin>>p.tel;
//cout<<"ingrese el email del docente: "; cin>>p.email;
vprofe.push_back(p);
cout<<"desea ingresar los datos de otro docente? s/n "; cin>>op;
}while(op == 's');
}
void registrarMateria(){
int op; char ops = 's';
do{
cout<<"Ingrese el nombre de la materia: "; cin>>m.nombre;
cout<<"elija el codigo del profesor que quiere asignar a la materia"<<endl;
for(int i=0; i<vprofe.size(); i++){
cout<<i<<". "<<vprofe[i].codigo<<endl;
}
cin>>op;
m.codAsi = vprofe[op].codigo;
vmateria.push_back(m);
cout<<"desea seguir ingresando datos de materias s/n "; cin>>ops;
}while (ops == 's');
}
bool guardar(){
bool guardado;
string datos = "";
cout<<vestudiantes.size()<<" tamano del vec"<<endl;
for (int i=0; i<vestudiantes.size(); i++){
datos += intAstring(vestudiantes[i].id)+","+vestudiantes[i].codigo+","+vestudiantes[i].nombre+","+vestudiantes[i].dir+","+intAstring(vestudiantes[i].tel)+","+vestudiantes[i].email+"\n";
//se concatenan los datos en el vector y despues se agregar al archivo datos_estudiantes.txt
}
d.open("datos_estudiantes.txt",ios::out | ios::app);
d<<datos;
d.close();
/*
for (int i=0; i<vprofe.size(); i++){
datos = vprofe[i].codigo+","+intAstring(vprofe[i].id)+","+vprofe[i].nombre+"\n";
d.open("datos_docentes.txt",ios::out|ios::app);
d<<datos;
d.close();
}
for (int i=0; i<vmateria.size(); i++){
datos = vmateria[i].nombre+","+vmateria[i].codAsi+"\n";
d.open("datos_materias.txt",ios::out|ios::app);
d<<datos;
d.close();
} */
return guardado;
}
void registrarNotas(){
for (int i = 0; i < vmateria.size(); i++)
{
for (int j=0; j < vestudiantes.size(); j++){
n.codMateria = vmateria[i].nombre;
n.codAlumno = vestudiantes[j].codigo;
cout<<"ingrese la nota del estudiante "<<vestudiantes[j].nombre<<" para la materia "<<vmateria[i].nombre<<endl;
cin>>n.nota;
vnota.push_back(n);
}
}/*
for (int i = 0; i < vnota.size(); i++)
{
cout<<vnota[i].codMateria<<"\t"<<vnota[i].codAlumno<<"\t"<<vnota[i].nota<<endl;
}*/
}
int stringAint(string cadena){ //coverte una cadena a un int
stringstream ss;
ss<<cadena; //el valor de cadena se agrega a una variable tipo sstream
int i;
ss>>i; //los datos de ss se pasan a i y el tipo de variable de ss pasa a int
}
string intAstring(int id){
stringstream ss;
ss<<id;
string ids;
ss>>ids;
return ids;
}