Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

zapis/odczyt do pliku, wektora zawierającego inny wektor

Ostatnio zmodyfikowano 2013-02-18 14:16
Autor Wiadomość
ziommus
Temat założony przez niniejszego użytkownika
zapis/odczyt do pliku, wektora zawierającego inny wektor
» 2013-02-18 13:48:59
Dzień dobry, pisząc mój programik pojawiła się potrzeba zapisywania i odczytywania danych do pliku. Niestety ze względu na dość nietypową jak dla mnie zawartość klasy, mam problem z poprawnym zapisaniem/odczytaniem. Tak wygląda klasa Element:

C/C++
class Element
{
public:
    Element();
    string polski;
    string angielski;
    double interval_multiplier;
    vector < int > mark_history;
    int adding_time;
    int last_revise;
    double revise_interval; /// wartość interwału dla kolejnej powtórki (licząc od adding time)
};
A o to funkcja zapisu:
C/C++
void File::Save_Progress()
{
    int i, liczba;
    string nazwa = "mem.txt";
    const char * name = nazwa.c_str();
   
    ofstream plik( name, ios::binary );
   
    if( plik )
         cout << endl << "zapis do pliku" << endl;
    else
         cout << endl << "Blad pliku!" << endl;
   
   
    for( i = 0; i < baza.size(); ++i )
         plik.write(( char * ) & baza[ i ], sizeof( Element ) );
   
    plik.close();
}
A to funkcja odczytu:

C/C++
void File::Load_Progress()
{
    int i, liczba;
    Element temp;
    string nazwa = "mem.txt";
    const char * name = nazwa.c_str();
   
   
    ifstream plik( name, ios::binary );
   
    if( plik )
         cout << endl << "odczyt z pliku" << endl;
    else
         cout << endl << "Blad pliku!" << endl;
   
   
    while( !plik.eof() )
    {
       
        plik.read(( char * ) & temp, sizeof( Element ) );
        baza.push_back( temp );
    }
   
    plik.close();
   
    system( "pause" );
}

Kompilator nie zgłasza żadnych błędów, ale w momencie gdy próbuję odczytać dane z pliku program się zawiesza. Nie jestem nawet pewny czy tak da się to zrobić. Być może trzeba będzie każde pole z klasy potraktować osobno. Za pomoc z góry dziękuję.
P-76485
kubawal
» 2013-02-18 14:16:35
C/C++
string nazwa = "mem.txt";
const char * name = nazwa.c_str();


ifstream plik( name, ios::binary );

Można to spokojnie zredukować do jednej linijki:
C/C++
ifstream plik( "mem.txt" );

Optymalizacja!

/edit:
We/wy binarne się do tego nie nadaje.
Zapisz to w postaci tekstu:
C/C++
istream & operator >>( istream & is, Element & e )
{
    is >> e.nazwa;
    //itd.
    for( int i = 0; i < e.jakis_wektor.size(); i++
    is >> e.jakis_wektor[ i ];
    //itd.
    return is;
}
P-76487
« 1 »
  Strona 1 z 1