C++:列出从容器中消失的元素
C++: List elements disappearing from container
我正在调用一个函数来从两个文件中读取一些数据并将其插入 class Corso 的实例中。 class 由一个校友列表组成,每个校友都有一个必须填充的考试列表,这就是 leggiEsame() 完成的。对 leggiEsame() 的第一次调用正确地添加了数据。不过,第二次调用似乎是将 Exams 添加到之前的调用中,但在某些时候新数据会消失。我正在从 main:
调用函数
#include <iostream>
#include <Corso.h>
using namespace std;
int main()
{
Corso c = Corso();
c.leggiEsame("informatica.txt", Esame(1, "Informatica", "Danilo Franchini", 31, 18, 0, 10));
c.leggiEsame("analisi.txt", Esame(2, "Analisi", "Marco Giovannetti", 31, 18, 0, 10));
c.stampa();
return 0;
}
leggiEsame() 是这样实现的:
void Corso::leggiEsame(string path, Esame e)
{
FILE *f = fopen(path.c_str(), "r");
if(f==NULL)
printf("File non valido.\n");
CodPersona cod_p;
NumMatricola num_m;
char str_voto[20];
float voto;
Alunno al = Alunno();
while(!feof(f))
{
char format[100] = "%[^\t]\t%[^\t]\t%[^\t]%*[^\n]\n";
fscanf(f, format, cod_p, num_m, str_voto);
if(string(str_voto)=="RIMANDATO")
voto = RIMANDATO;
else if(string(str_voto)=="30 e Lode")
voto = LODE;
else if(string(str_voto)=="ASSENTE")
voto = ASSENTE;
else
voto = atof(str_voto);
e.setVoto(voto);
al.setCodPersona(string(cod_p));
al.setNumMatricola(string(num_m));
aggiornaAlunno(al, e);
/*Alunno a = *cercaAlunno(al);
printf("Alunno %s aggiornato, ha %d esami\n", a.numMatricola().c_str(), a.esami().size());*/
}
fclose(f);
}
aggiornaAlunno() 执行以下操作:
void Corso::aggiornaAlunno(Alunno a, Esame e)
{
Alunno a_found;
list<Alunno>::iterator it = cercaAlunno(a);
/// cerco l'alunno nella classe, se è già presente (iteratore diverso da m_alunni.end())
/// se l'alunno esiste già allora aggiorna i dati anagrafici dell'alunno
/// altrimenti aggiunge l'alunno alla classe.
if(it!=m_alunni.end())
{
a_found = *it;
a_found.aggiornaDati(a);
/// se l'alunno già esistente non contiene l'esame allora lo aggiunge
if(!a_found.contieneEsame(e, 0))
{
a_found.aggiungiEsame(e);
printf("Aggiunto esame %d su %d a %s\n", e.id(), a_found.esami().size(), a_found.numMatricola().c_str());
}
}
else
{
printf("nuovo alunno\n");
a.aggiungiEsame(e);
aggiungiAlunno(a);
}
}
条件的 "else" 分支似乎工作正常,因为它添加了第一个读数的数据,而第二个读数调用 aggiungiEsame():
void Alunno::aggiungiEsame(Esame e)
{
m_esami.push_front(e);
printf("Aggiunto esame %d a %s, n esami: %d\n", e.id(), m_num_matricola.c_str(), m_esami.size());
}
在这个函数内部输出正常,似乎新数据已添加到每个检查列表中,因为大小输出 2,在 aggiornaAlunno() 内部也是如此。
当函数 returns 到 leggiEsame() 时,列表的大小再次输出 1,即使没有进行删除。
希望能帮到你,先谢谢了。
您没有将数据添加到现有的 Alunno
对象,而是将其添加到对象的 副本。 a_found = *it
将 *it
的内容复制到 a_found
中,但它们是单独的对象。一旦 a_found
超出范围,它就会被销毁,连同您添加到其中的任何内容。
我正在调用一个函数来从两个文件中读取一些数据并将其插入 class Corso 的实例中。 class 由一个校友列表组成,每个校友都有一个必须填充的考试列表,这就是 leggiEsame() 完成的。对 leggiEsame() 的第一次调用正确地添加了数据。不过,第二次调用似乎是将 Exams 添加到之前的调用中,但在某些时候新数据会消失。我正在从 main:
调用函数#include <iostream>
#include <Corso.h>
using namespace std;
int main()
{
Corso c = Corso();
c.leggiEsame("informatica.txt", Esame(1, "Informatica", "Danilo Franchini", 31, 18, 0, 10));
c.leggiEsame("analisi.txt", Esame(2, "Analisi", "Marco Giovannetti", 31, 18, 0, 10));
c.stampa();
return 0;
}
leggiEsame() 是这样实现的:
void Corso::leggiEsame(string path, Esame e)
{
FILE *f = fopen(path.c_str(), "r");
if(f==NULL)
printf("File non valido.\n");
CodPersona cod_p;
NumMatricola num_m;
char str_voto[20];
float voto;
Alunno al = Alunno();
while(!feof(f))
{
char format[100] = "%[^\t]\t%[^\t]\t%[^\t]%*[^\n]\n";
fscanf(f, format, cod_p, num_m, str_voto);
if(string(str_voto)=="RIMANDATO")
voto = RIMANDATO;
else if(string(str_voto)=="30 e Lode")
voto = LODE;
else if(string(str_voto)=="ASSENTE")
voto = ASSENTE;
else
voto = atof(str_voto);
e.setVoto(voto);
al.setCodPersona(string(cod_p));
al.setNumMatricola(string(num_m));
aggiornaAlunno(al, e);
/*Alunno a = *cercaAlunno(al);
printf("Alunno %s aggiornato, ha %d esami\n", a.numMatricola().c_str(), a.esami().size());*/
}
fclose(f);
}
aggiornaAlunno() 执行以下操作:
void Corso::aggiornaAlunno(Alunno a, Esame e)
{
Alunno a_found;
list<Alunno>::iterator it = cercaAlunno(a);
/// cerco l'alunno nella classe, se è già presente (iteratore diverso da m_alunni.end())
/// se l'alunno esiste già allora aggiorna i dati anagrafici dell'alunno
/// altrimenti aggiunge l'alunno alla classe.
if(it!=m_alunni.end())
{
a_found = *it;
a_found.aggiornaDati(a);
/// se l'alunno già esistente non contiene l'esame allora lo aggiunge
if(!a_found.contieneEsame(e, 0))
{
a_found.aggiungiEsame(e);
printf("Aggiunto esame %d su %d a %s\n", e.id(), a_found.esami().size(), a_found.numMatricola().c_str());
}
}
else
{
printf("nuovo alunno\n");
a.aggiungiEsame(e);
aggiungiAlunno(a);
}
}
条件的 "else" 分支似乎工作正常,因为它添加了第一个读数的数据,而第二个读数调用 aggiungiEsame():
void Alunno::aggiungiEsame(Esame e)
{
m_esami.push_front(e);
printf("Aggiunto esame %d a %s, n esami: %d\n", e.id(), m_num_matricola.c_str(), m_esami.size());
}
在这个函数内部输出正常,似乎新数据已添加到每个检查列表中,因为大小输出 2,在 aggiornaAlunno() 内部也是如此。 当函数 returns 到 leggiEsame() 时,列表的大小再次输出 1,即使没有进行删除。 希望能帮到你,先谢谢了。
您没有将数据添加到现有的 Alunno
对象,而是将其添加到对象的 副本。 a_found = *it
将 *it
的内容复制到 a_found
中,但它们是单独的对象。一旦 a_found
超出范围,它就会被销毁,连同您添加到其中的任何内容。