Jump to content
Americo Pereira

C++ porquê Segmentation fault?

Recommended Posts

Americo Pereira
#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 ?] 

Share this post


Link to post
Share on other sites
HappyHippyHippo

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 ...

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Americo Pereira

Obrigado Happy, obrigado pela resposta.

 Tens toda a razão. 

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.