I got an issue, when I try to read char* professeur
in a binary file it fails, giving me a segmentation fault in the read()
function. What's weird is that for all other load
function in other classes to read char*
members works just fine but for this one, even if the professeur
is written correctly in the I got a seg fault.
So here is the code:
Cours.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#include "Liste.h"
#include "Event.h"
#include "Professeur.h"
class Cours: public Event
{
private:
char* professeur;
Liste<int> groupes;
public:
void save(ofstream&) const;
void load(ifstream&);
};
Cours.cpp
void Cours::save(ofstream& o) const
{
int n=strlen(professeur);
char buff[60], *buff2;
o.write((char *)&n, sizeof(int));
strcpy(buff, getProfesseur());
o.write(buff, n+1);
groupes.save(o);
Event::save(o);
}
void Cours::load(ifstream& i)
{
int n;
char buff[60];
i.read((char *)&n, sizeof(int));
cout<<"n: "<<n<<endl;
if(i.read(buff, n+1))//seg fault
{
strcpy(professeur, buff);
cout<<"prof: "<<professeur<<endl;
}
else
cout<<"erreur read prof cours"<<endl;
groupes.load(i);
Event::load(i);
}
n
should be checked to make sure it doesn't get larger than the buffer.
In save()
:
int n=strlen(professeur);
n
should be max 59 here - needs to be checked.
In load()
:
i.read((char *)&n, sizeof(int));
Better check n
here too (max 59).
Also:
int n=strlen(professeur);
char buff[60], *buff2;
o.write((char *)&n, sizeof(int));
strcpy(buff, getProfesseur());
o.write(buff, n+1);
Two different values are used to write the data: strlen(professeur)
and then getProfesseur()
.
You also don't allocate memory for professeur
(at least not in the shown code). So strcpy(professeur, buff);
in load()
will fail too.
You might as well change:
private:
char* professeur;
to
private:
char professeur[60];
That way you don't have to allocate
and deallocate
memory yourself.
And make sure all strings are null-terminated.
Of course, if the exercise allows it, you can use string
instead (string professeur;
), and stream the data in and out using <<
and >>
.
First you read the length of the name. Allocat as many char
as the name is long +1 for /0
, right to target. Read from file to target and append \0
at the end:
void Cours::load(ifstream& i)
{
int n;
i.read((char *)&n, sizeof(int));
cout<<"n: "<<n<<endl;
if ( n <= 0 )
return;
professeur = new char[n+1]; // allocate professeur
if ( i.read( professeur, n ) ) // read directly to professeur
{
professeur[ n ] = ´\0`; // write \0 at end of name
cout<<"prof: "<<professeur<<endl;
}
else
{
delete [] professeur;
professeur = nullptr;
cout<<"erreur read prof cours"<<endl;
}
groupes.load(i);
Event::load(i);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With