Oppure

Loading
19/09/10 8:43
spitty_cash
Salve a tutti,
vorrei un aiuto su questo tipo di errore...programmo sotto ambiente linux, ma questo errore è presente anche su windows, con compilatore MinGW g++.
Molto probabilmente l'errore è dato dalla mia ignoranza ma cio che non mi spiego è perchè usando il compilatore microsoft visual c++ non c'è nessun tipo di errore invece con MinGW mi da errore nella lettura del file(Segmentation fault)...e forse anche nella scrittura.
Praticamente questo programma scrive una struttura in un file binario e successivamente la va a leggere mandando in output su console i dati della struttura...vi posto il codice:
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
    struct Contatto{ string nome; string cognome; };
    Contatto Spitty;

    Spitty.nome="Nome_Spitty";
    Spitty.cognome="Cognome_Spitty";

    //Scrittura Spitty su file
    ofstream out;
    out.open( "dati.rub", ios::out | ios::app | ios::binary );
    out.write( (char*)&Spitty, sizeof(Spitty) );
    out.close();

    //Cambio valori nella struttura ( per verificare che la funzione read abbia letto correttamente )
    Spitty.nome="Vuoto";
    Spitty.cognome="Vuoto";
    cout<<endl;


    //Visualizzazione struttura Spitty
    cout<<"\nNome: "<<Spitty.nome;
    cout<<"\nCognome: "<<Spitty.cognome;



    //Lettura valori nel file binario
    ifstream in;
    in.open( "dati.rub", ios::in | ios::binary );
    in.read( (char*)&Spitty, sizeof(Spitty) );
    in.close();

    //Visualizzazione struttura Spitty
    cout<<"\nNome: "<<Spitty.nome;
    cout<<"\nCognome: "<<Spitty.cognome;
    cout<<endl;


    return 0;
}


Grazie per eventuali risposte!
Ciao a tutti.
Ultima modifica effettuata da spitty_cash 19/09/10 9:00
aaa
19/09/10 9:17
Bonny
Nota: Se sei un GNU g + + utente (versione 2.7.x o precedenti), quindi non utilizzare i / le bandiere mode o durante l'apertura di oggetti ifstream. Because of a bug in the GNU libg++ implementation, the flags will not be correctly interpreted. A causa di un bug nel GNU libg + + attuazione, le bandiere non verrà interpretato correttamente. If you are working under Unix, omit the i/o mode flags entirely; if you are working with g++ under MS-DOS, then use an fstream object. Se si lavora sotto Unix, omettere i / le bandiere mode o del tutto, se si lavora con g + + MS-DOS, quindi utilizzare un oggetto fstream. This note applies to g++ users only . La presente nota vale per gli utenti g + + solo.

Ho trovato questa nota leggendo questo tutorial :
[url]
angelfire.com/country/aldev0/cpphowto/…
[/url]

Spero di esserti stato d'aiuto;)
Ultima modifica effettuata da Bonny 19/09/10 9:21
aaa
19/09/10 10:42
spitty_cash
Grazie per la risposta Bonny,
sono andato sul sito che mi hai linkato...in pratica c'è scritto che se uso GNU g++ non devo usare le mode flags ( ios::app, ios::beg ) perchè c'è un bug nella libreria "libg++" e a quanto pare dice anche che se uso GNU g++ sul Prompt dei comandi di windows non posso nemmeno dichiarare oggetti di tipo ifstream o ofstream ma solamente fstream...bella castrazione...vabbè chissà se queste limitazioni/bug sono solamente per il metodo open() oppure anche per seekg e seekp....bah.
Certo che bella castrazione...
Cmq grazie per l'illuminazione...dopo pranzo provo a ricompilare l'eseguibile sia su linux che su windows e vedo se risulta vero quello che dicono su quel sito.
aaa
19/09/10 11:11
spitty_cash
Allora...ho voluto provare subito...ne su linux ne su windows funziona il programma...anche non mettendo i mode flags e anche non dichiarando ifstream o ofstream ma semplicemente fstream...posto il codice che ho provato su linux:
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
    struct Contatto{ string nome; string cognome; };
    Contatto Spitty;

    Spitty.nome="Nome_Spitty";
    Spitty.cognome="Cognome_Spitty";

    //Scrittura Spitty su file
    ofstream out;
    out.open( "dati.rub" );
    out.seekp(0);
    out.write( (char*)&Spitty, sizeof(Spitty) );
    out.close();

    //Cambio valori nella struttura ( per verificare che la funzione read abbia letto correttamente )
    Spitty.nome="Vuoto";
    Spitty.cognome="Vuoto";
    cout<<endl;


    //Visualizzazione struttura Spitty
    cout<<"\nNome: "<<Spitty.nome;
    cout<<"\nCognome: "<<Spitty.cognome;



    //Lettura valori nel file binario
    ifstream in;
    in.open( "dati.rub" );
    in.seekg(0);
    in.read( (char*)&Spitty, sizeof(Spitty) );
    in.close();

    //Visualizzazione struttura Spitty
    cout<<"\nNome: "<<Spitty.nome;
    cout<<"\nCognome: "<<Spitty.cognome;
    cout<<endl;

    return 0;
}

Chiedo aiuto a qualche programmatore che sviluppa su linux e che sicuramente usa GNU MinGW g++...grazie
Ultima modifica effettuata da spitty_cash 19/09/10 12:33
aaa
19/09/10 11:41
spitty_cash
Messaggio eliminato...avevo scritto una cavolata...:rofl:
Ultima modifica effettuata da spitty_cash 19/09/10 18:08
aaa
20/09/10 11:28
Bonny
Di niente figurati:k:
aaa
20/09/10 12:01
lumo
il problema è nella read, non puoi leggere una struttura con due string così...
dovresti fare
out << Spitty.nome << Spitty.cognome;
/* ... */
in >> Spitty.nome >> Spitty.cognome;
aaa
20/09/10 12:41
spitty_cash
Postato originariamente da lumo:

il problema è nella read, non puoi leggere una struttura con due string così...
dovresti fare
out << Spitty.nome << Spitty.cognome;
/* ... */
in >> Spitty.nome >> Spitty.cognome;

lumo grazie per la risposta,
purtroppo quello che dici è scorretto...nel c++ posso leggere una struttura tramite un read(); gli passo la struttura e il suo size...e naturalmente su Microsoft Visual C++ 2008/2010 funziona tutto alla perfezione...l'avevo detto anche sopra che con Visual C++ funzionavano i metodi.
Quello che hai scritto tu è forse la sintassi per scrivere e leggere da file di testo tipo *.txt senza alcuna struttura. Mentre qui si parla di file binari!
Per rispondere bisogna conoscere gli stream di tipo fstream e i relativi metodi...altrimenti così si dicono solo cavolate e non si va da nessuna parte!
RIPETO: IN VISUAL C++ 2010 FUNZIONA TUTTO...MENTRE UTILIZZANDO IL COMPILATORE MINGW G++ C'E' UNA SEGMENTATION FAULT O ERRORI SIA IN SCRITTURA CHE IN LETTURA...MINGW SIA SU WINDOWS CHE SU LINUX.
Esperti rispondete!
aaa