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

Problem z zapisem odczytem danych z pliku

Ostatnio zmodyfikowano 2013-05-17 17:52
Autor Wiadomość
zgm92
Temat założony przez niniejszego użytkownika
Problem z zapisem odczytem danych z pliku
» 2013-05-17 17:09:50
Zacznę od tego że wszystko się kompiluje i działa.
Problem mój wygląda tak:

1. Włączam program (narazie brak bazy danych)
2. Dodaje 3 elementy do vectora
3. Sprawdzam wyświetla że są 3
4. Zamykam program z użyciem funkcji do zapisu która zapisuje dane do pliku
5. Włączam program jeszcze raz  są juz 4 elementy ( skopiowany ostatni)
6. Zamykam x na gorze w okienku
7. Włączam nadal są 4 elementy
8. Zamykam z uzyciem funkcji
9. Włączam jest juz 5...

nie wiem co mam źle i brakuje mi pomysłów chyba coś z znakiem końca pliku choć pewności nie mam. Oto kod tych dwóch funkcji:

C/C++
void zaladuj_ksiazki( vector < ksiazka > & w ) {
   
    fstream plik( "base.bs", ios::in | ios::binary );
    string linia;
    streamsize dlugosc;
    char bufor[ 1024 ];
    w.clear();
   
    cout << w.size();
   
    _getch();
   
    if( plik.good() == true ) {
        while( !plik.eof() ) {
            plik >> dlugosc; //pobiera dlugosc napisu
            plik.read( bufor, dlugosc ); //pobiera caly wyraz co wczesniej go zapisalem
            linia = bufor; // to jest bo bez tego nie dziala cos sie samo rzutowac nie chce
            w.push_back( rozdziel_string_ksiazka( linia ) ); //tu rozbija stringa na elementy klasy i dodaje do wektora
           
        }
       
        plik.close();
       
    }
   
}

void zapisz_ksiazki( vector < ksiazka > & w ) {
   
   
    fstream plik( "base.bs", ios::out | ios::binary );
    string wyraz;
   
   
    for( unsigned int i = 0; i < w.size(); i++ ) {
        wyraz = ' ' + w[ i ].id + '\t' + w[ i ].tytul + '\t' + w[ i ].autor + '\t' + w[ i ].isbn + '\t' + w[ i ].numer_regalu + '\t' + w[ i ].numer_polki + '\0';
       
        plik << wyraz.size(); // zapisuje wielkosc wyrazu
        plik.write( wyraz.c_str(), wyraz.size() ); //teraz caly wyraz zapisuje
       
    }
   
    plik.close();
   
}
P-83162
akwes
» 2013-05-17 17:46:55
Co tu się naprawdę dzieje?
C/C++
while( !plik.eof() ) // Sprawdzamy czy jest koniec pliku
{
    plik >> dlugosc; // Wczytujemy dana. To moze teraz osiagnelismy koniec pliku?
    plik.read( bufor, dlugosc ); // Wczytujemy dane. A moze teraz?
    // !!
    linia = bufor; // nie wiadomo jaki jest stan strumienia. Byc moze juz jest eof i linia zawiera stare lub dziwne dane.
    w.push_back( rozdziel_string_ksiazka( linia ) );
   
}

W miejscu gdzie są wykrzykniki warto by było sprawdzić, czy nie osiągnęliśmy końca pliku. Na szybko można to zrobić przez
if( plik.eof() ) break;
P-83163
zgm92
Temat założony przez niniejszego użytkownika
» 2013-05-17 17:52:34
No właśnie tego brakowało, nie zauważyłem teraz działa ładnie :) dzięki i zamykam
P-83165
« 1 »
  Strona 1 z 1