Americo Pereira Posted June 8, 2018 at 10:48 AM Report #610895 Posted June 8, 2018 at 10:48 AM #include <iostream> #include <string> #include <fstream> #include <sstream> using namespace std; class ola{ private: int a; int b; string str; public: void atribui(int,int,string); void le(void); }; void ola::atribui(int A, int B, string str){ this->a=A; this->b=B; this->str=str; } void ola::le(){ //Porquê que dá Erro de 'Segmentation fault // se mandar escrever str ou mesmo quando evoco a variabel str cout << a <<","<< b<<" " <<str<< endl; } main(){ ofstream fout; ifstream fin; ola a; string o; fout.open("bem.dat",ios::app|ios::binary); if(fout.fail()){ fout<< "erro abertura de ficheiro"; }else cout << "ficheiro aberto\n"; a.atribui(4,2,"ola"); //fout.seekp(0*sizeof(ola),ios::end); fout.write((char*)&a,sizeof(ola)); if(fout.fail()) cout<< "erro escrita"<<endl; else cout <<"escreveu"<<endl; a.atribui(4,2,"Prof"); //fout.seekp(1*sizeof(ola),ios::end); fout.write((char*)&a,sizeof(ola)); if(fout.fail()) cout<< "erro escrita"<<endl; else cout <<"escreveu"<<endl; fout.close(); fin.open("bem.dat",ios::in|ios::binary); while(!fin.eof()){ fin.read((char*)&a,sizeof(ola)); if(fin.fail()){ cout<< "erro Leitura"; break; } else a.le(); fin.peek(); } fin.close(); } Bom dia companheiros, alguém me sabe explicar como posso resolver o problema de segmentation fault quando o metodo le() manda escrever a variavel privada str do tipo string? Ou não posso guardar em ficheiro dados que contenham objectos nos dados privados? Terei que substituir string str pro char str[250 ?]
HappyHippyHippo Posted June 8, 2018 at 09:33 PM Report #610900 Posted June 8, 2018 at 09:33 PM read e write serve para escrever dados binários, e sendo str um objecto tendo internamente ponteiros, o que estás a guardar no ficheiro são referências de memória. o que nunca deve ser feito. a razão porque nunca deve ser feito, é que referências de memória só tem significado num contexto reduzido (tempo de execução, escopro de execução, etc), e quando estás a dizer ao teu objecto que agora aponta para uma zona de memória desconhecida (o que podes fazer sem problemas), resulta que quando vais ler essa memória "do jeitinho que a string gosta", vai correr mal ... 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Americo Pereira Posted June 10, 2018 at 10:35 AM Author Report #610920 Posted June 10, 2018 at 10:35 AM Obrigado Happy, obrigado pela resposta. Tens toda a razão.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now