Oppure

Loading
20/09/10 13:03
lumo
Postato originariamente da 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!

peccato che io l'abbia provato su g++
versione 4.4.3 con libstdc++ 6.0.3
Ultima modifica effettuata da lumo 20/09/10 13:06
aaa
20/09/10 15:12
spitty_cash
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 20/09/10 15:14
aaa
20/09/10 20:42
lumo
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.

hai ragione, farò proprio così
gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/…
[string.h]
template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_ostream<_CharT, _Traits>&
     operator<<(basic_ostream<_CharT, _Traits>& __os,
            const basic_string<_CharT, _Traits, _Alloc>& __str)
     {
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // 586. string inserter not a formatted function
       return __ostream_insert(__os, __str.data(), __str.size());
     }

[ostream_insert.h]
pierotofy.it/pages/users/copypastebin/…
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++
struct string
{
    char* m_buf;

    /* ... */

    void operator=( const char* 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 20/09/10 21:26
aaa
21/09/10 10:13
spitty_cash
Postato originariamente da lumo:

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.

hai ragione, farò proprio così
gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/…
[string.h]
template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_ostream<_CharT, _Traits>&
     operator<<(basic_ostream<_CharT, _Traits>& __os,
            const basic_string<_CharT, _Traits, _Alloc>& __str)
     {
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // 586. string inserter not a formatted function
       return __ostream_insert(__os, __str.data(), __str.size());
     }

[ostream_insert.h]
pierotofy.it/pages/users/copypastebin/…
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++
struct string
{
    char* m_buf;

    /* ... */

    void operator=( const char* 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.
aaa