Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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:
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.
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:
Codice sorgente - presumibilmente C++
#include <iostream>
#include <string>
#include <fstream>
usingnamespace 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;
return0;
}
Chiedo aiuto a qualche programmatore che sviluppa su linux e che sicuramente usa GNU MinGW g++...grazie
Ultima modifica effettuata da spitty_cash il 19/09/2010 alle 14:33
che palle lo sapevo che andava a finire così...lumo nn mi va di incazzarmi solamente perchè tu non conosci il c++...apri un qualsiasi libro di testo sul c++ e studiati come funziona l'accesso sequenziale/diretto agli archivi con record a lunghezza costante ( in gergo scrivi su un file binario una struttura dati ).
Cioè è pazzesco...ti sto dicendo che quel codice con visual c++ funziona e tu mi dici che devo scrivere con gli operator << >> ??? Guardati la libreria fstream invece di scrivere cavolate.
Anzi testa il codice su visual c++ e accorgiti di non saper scrivere archivi a record di lunghezza costante.
Ultima modifica effettuata da spitty_cash il 20/09/2010 alle 17:14
Postato originariamente da spitty_cash: Cioè è pazzesco...ti sto dicendo che quel codice con visual c++ funziona e tu mi dici che devo scrivere con gli operator << >> ??? Guardati la libreria fstream invece di scrivere cavolate.
[ostream_insert.h]
http://www.pierotofy.it/pages/users/copypastebin/viewCode. ... come vedi dal sorgente la funzione usa ostream::write, quindi la scrittura formattata può essere usata benissimo con file aperti in modalità binaria. E ora: perchè write non va su g++.
Il fatto è che, supponendo che la std::string abbia un'implementazione simile nella libstdc++
Codice sorgente - presumibilmente C#
structstring
{
char* m_buf;
/* ... */
voidoperator=(constchar* data )
{
uint32 len = strlen(data);
m_buf = Allocator.alloc(len+1);
strcpy( m_buf, data, len );
}
};
quando fai un cast del genere (char*)&stringa, non ottieni i dati della stringa sottoforma di C string, ma l'indirizzo del puntatore, non so se mi spiego.
Quindi alla fine, quando vai a fare write(), non stampi i veri dati ma solo un indirizzo. Non so perchè su MSVC funzioni, ma manvb.net ha guardato e pensa che l'implementazione di msvc usi un buffer statico per memorizzare i dati( mi pare strano ma boh ).
E poi, arrabbiati quanto vuoi, ma questo forum è aperto e se qualcuno vuole aiutarti e pensa di avere la soluzione al tuo problema è libero di postare. Io ho addirittura provato il tuo programma, ora ti ho anche dato una spiegazione, e lo farò finchè sarò convinto di avere ragione. Se riuscirai a dimostrarmi il contrario su g++, allora ok, ma intanto accontenati di chi cerca di aiutarti, perchè qui nessuno viene pagato per darti le risposte.
Ultima modifica effettuata da lumo il 20/09/2010 alle 23:26
Postato originariamente da spitty_cash: Cioè è pazzesco...ti sto dicendo che quel codice con visual c++ funziona e tu mi dici che devo scrivere con gli operator << >> ??? Guardati la libreria fstream invece di scrivere cavolate.
[ostream_insert.h]
http://www.pierotofy.it/pages/users/copypastebin/viewCode. ... come vedi dal sorgente la funzione usa ostream::write, quindi la scrittura formattata può essere usata benissimo con file aperti in modalità binaria. E ora: perchè write non va su g++.
Il fatto è che, supponendo che la std::string abbia un'implementazione simile nella libstdc++
Codice sorgente - presumibilmente C#
structstring
{
char* m_buf;
/* ... */
voidoperator=(constchar* data )
{
uint32 len = strlen(data);
m_buf = Allocator.alloc(len+1);
strcpy( m_buf, data, len );
}
};
quando fai un cast del genere (char*)&stringa, non ottieni i dati della stringa sottoforma di C string, ma l'indirizzo del puntatore, non so se mi spiego.
Quindi alla fine, quando vai a fare write(), non stampi i veri dati ma solo un indirizzo. Non so perchè su MSVC funzioni, ma manvb.net ha guardato e pensa che l'implementazione di msvc usi un buffer statico per memorizzare i dati( mi pare strano ma boh ).
E poi, arrabbiati quanto vuoi, ma questo forum è aperto e se qualcuno vuole aiutarti e pensa di avere la soluzione al tuo problema è libero di postare. Io ho addirittura provato il tuo programma, ora ti ho anche dato una spiegazione, e lo farò finchè sarò convinto di avere ragione. Se riuscirai a dimostrarmi il contrario su g++, allora ok, ma intanto accontenati di chi cerca di aiutarti, perchè qui nessuno viene pagato per darti le risposte.
lumo io ti ringrazio per la risposta, ma io devo scrivere su file una struttura...non devo scrivere e leggere una singola stringa in un file binario...cmq se hai la soluzione a questa cosa postala e vediamo.
il problema è nella read, non puoi leggere una struttura con due string così...
dovresti fare
Codice sorgente - presumibilmente C/C++
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!