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

[C++] Zapis edytowanej wartości do pliku binarnego

Ostatnio zmodyfikowano 2017-02-03 10:29
Autor Wiadomość
mrost13
Temat założony przez niniejszego użytkownika
[C++] Zapis edytowanej wartości do pliku binarnego
» 2017-02-02 14:42:46
Witam!
Podczas pisania jednego z programów trafiłem na mały problem- otóż gdy w pliku binarnym mam zapisany jeden rekord to funkcjonalność jest spełniana (edycja rekordu).
Gdy dodaję drugi rekord to podczas próby edycji pierwszego rekordu rekord nr. 2 zostaje zapisany na miejscu rekordu nr. 1
Edycja rekordu numer 2 działa bez problemu.
Przy większej ilości rekordów edycja działa dla kolejnych tylko nie dla nr. 1 (zostaje on zastąpiony danymi z nr. 2)

Sam nie widzę już błędu, więc liczę na pomoc forumowiczów, za którą z góry dziękuję :)

Podaję kod funkcji:
C/C++
void sprzedaj()
{
    towary t;
    int ile_sprzedac = 0;
    bool czy_jest = false;
    char nazwa[ 64 ];
    int pozycja = 0;
   
    cout << "Nazwa: ";
    cin >> nazwa;
   
    ifstream plik1( "towary.dat", ios::binary | ios::app | ios::out | ios::in );
   
    while( 1 )
    {
        if( plik1.eof() ) break; {
            plik1.read( reinterpret_cast < char *>( & t ), sizeof( t ) );
           
            pozycja++;
            if( strcmp( nazwa, t.nazwa ) == 0 )
            {
                cout << "Ilosc: ";
                cout << t.ilosc;
                czy_jest = true;
               
                cout << endl << "Ile sprzedac: ";
                cin >> ile_sprzedac;
                while( t.ilosc < ile_sprzedac ) {
                    cout << "Nie ma tylu sztuk, podaj jeszcze raz: ";
                    cin >> ile_sprzedac;
                }
                t.ilosc = t.ilosc - ile_sprzedac;
                if( t.ilosc < t.ilosc_min )
                {
                    zamowienie( t );
                    t.ilosc = t.ilosc_max;
                }
                while( 1 )
                {
                    plik1.read( reinterpret_cast < char *>( & t ), sizeof( t ) );
                   
                    if( plik1.eof() )
                         break;
                   
                    if( strcmp( nazwa, t.nazwa ) == 0 )
                    {
                        plik1 >> t.ilosc;
                    }
                }
            }
            cout << endl << endl;
        }
       
    }
    if( czy_jest == false ) {
        cout << "nie ma takiego produktu w bazie";
        getch();
    }
    plik1.close();
   
    ofstream plik2( "towary.dat", ios::binary | ios::in | ios::ate );
    plik2.seekp( sizeof( struct towary ) *( pozycja - 1 ) );
   
    plik2.write( reinterpret_cast < char *>( & t ), sizeof( t ) );
    plik2.close();
   
    system( "cls" );
    menu();
}
P-157229
1aam2am1
» 2017-02-02 18:12:14
Poco po wczytaniu i edycji t, jeżeli nazwy się zgadzają. Czytasz drugi raz plik?
P-157237
j23
» 2017-02-03 10:29:41
A nie lepiej wczytać wszystkie rekordy do vectora, edytować sobie go, a pod koniec zapisać całość z powrotem do pliku?
P-157264
« 1 »
  Strona 1 z 1